Короткий вступ до тегів Docker

Якщо ви хоч трохи працювали з Docker, я впевнений, ви стикалися з тегами. Вони часто виглядають як "my_image_name: 1", де частина після двокрапки відома як тег. Тег не завжди вказується при позначенні зображень, але ми розберемося в цьому пізніше.

З тих пір, як я почав використовувати Docker, мене дуже бентежили теги. Документація не дуже добре їх пояснює, і ретельних пояснень з цієї теми насправді немає. Тому я вирішив написати цей пост.

Що таке теги Docker?

Отже, що таке теги Docker? Простими словами, теги Docker передають корисну інформацію про конкретну версію / варіант зображення. Вони є псевдонімами до ID вашого зображення , які часто виглядають так: f1477ec11d12. Це просто спосіб посилання на ваш образ. Хороша аналогія - теги Git посилаються на певний коміт у вашій історії.

Два найпоширеніші випадки, коли теги вступають у гру:

  1. Створюючи зображення, ми використовуємо таку команду:
docker build -t username/image_name:tag_name .

Спробуємо трохи розпакувати те, що робить ця команда. Ми просимо демон Docker отримати файл Docker, присутній у поточному каталозі (це .робить кінець). Далі ми просимо демону Docker створити образ і присвоїти йому вказаний тег. Якщо ви запускаєте docker images, ви повинні побачити зображення, чиє сховище username/image_nameта тег tag_name.

username/image_name не є обов’язковим форматом для зазначення назви зображення. Це просто корисна умова, щоб уникнути повторного позначення вашого зображення, коли вам потрібно надіслати його до реєстру.

Ваше зображення можна назвати як завгодно. Для загальнодоступного реєстру Docker під час іменування зображень ви обмежені дворівневою ієрархією. Наприклад, ваше зображення не може мати імені. a/b/c:1.Це обмеження, як правило, не існує в приватних реєстрах. Як зазначалося раніше, не обов’язково вказувати: tag_name.Побачимо, що станеться в такому випадку найближчим часом.

2. Явне позначення зображення за допомогою tagкоманди.

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

Ця команда просто створює псевдонім (посилання) на ім'я того, TARGET_IMAGE що посилається на SOURCE_IMAGE.Це все, що він робить. Це як присвоєння існуючому образу іншого імені для посилання на нього. Зверніть увагу, як тег тут також є необов’язковим, за допомогою [:TAG].

Що станеться, якщо ви не вкажете тег?

Добре, тепер давайте розкриємо, що відбувається, коли ви не вказуєте тег під час позначення зображення. Тут latestмітка потрапляє на малюнок. Кожного разу, коли зображення позначається без явного тегу, воно додається latest за замовчуванням. Це невдалий вибір імен, що викликає багато плутанини. Але мені подобається сприймати це як тег за замовчуванням, який призначається зображенням, коли ви не вказуєте його.

Багато плутанини latestспричинене очікуванням, що це остання версія зображення, особливо в Dockerfiles. Давайте розглянемо різні сценарії на прикладі:

Сценарій 1:

Припустимо, у нашому файлі Docker присутній наступний вислів:

FROM debian

Оскільки ми не вказали жодного тегу, Docker додасть latestтег і спробує витягнути зображення debian:latest.

Сценарій 2:

FROM debian:9.3

Оскільки тут явно зазначено тег, Docker витягне образ Debian із позначкою 9.3

Ще одне, про що слід пам’ятати, - це те, що немає правила, яке б стверджувало, що зображення має мати лише один тег. Зображення може мати кілька тегів, і вони зазвичай використовуються для вказівки основної та другорядної версій. Наприклад, розглянемо це:

На момент написання цього поста, то latestтег для зображення Debian вказує на 9.3випуск і на 9випуску. Це, швидше за все, зміниться в майбутньому, коли основна чи другорядна версія буде накладена на зображення.

Зверніть увагу, що теги, що використовуються для семантичного встановлення версій, є дотриманням, але теги були розроблені не лише для цієї мети.

На закінчення, останні - це не спеціальний тег

Головним виводом з того, що ми висвітлювали дотепер, є те, що останній, як і будь-який інший тег . Розробник несе відповідальність за тег зображень належним чином, що latestзавжди вказує на останній стабільний випуск зображення.

Отже, ми явно не вказуємо тег у наших файлах Docker під час витягування зображень, оскільки у нас може вийти зовсім інша версія базового зображення, ніж та, що ми використовували раніше. Немає жодних гарантій щодо того, чи буде це великим чи незначним ударом. Навіть старий випуск можна позначити як latest.

PS Якщо ви виявили помилкові уявлення / помилки у дописі, будь ласка, не соромтеся писати мені твіт @ScribbingOn.

Дякую Жерему Петаццоні за те, що він допоміг мені зрозуміти щось із цього.