Правильное версионирование образов Docker - PullRequest
0 голосов
/ 20 мая 2019

Следуя 4-летнему вопросу Управление версиями образа Docker и управление жизненным циклом , потому что, по-моему, оно не решало проблемы с версией образов Docker должным образом :

Я не считаю этот ответ адекватным, поскольку могут быть последовательные версии одного и того же тега. Нам нужен способ, чтобы иметь возможность заблокировать зависимости для конкретной версии тега.

а также

ответ не использовать latest.

«Решение», которое я нашел в сети, тоже сбивает с толку. Например,

  • Здесь это намекнул не использовать latest, а "решение" намекнуло , чтобы пометить дважды. Я подчеркиваю « намекнул », потому что нет твердой рекомендации (для меня).
  • И здесь это даже показывает, что нам нужно сделать docker push дважды на одном изображении.

Итак, как правильно создавать версии образов Docker (как локально, так и при отправке / публикации в концентратор Docker)?

AMEND:

Пока есть два ответа. Спасибо за это.

  • Оба используют короткий идентификатор Git.
  • И оба пропускают часть ответа / публикации из ответа.

Поскольку мне нужно нужно отправить / опубликовать мой образ докера в хранилище Docker, и из здесь он намекнул , что не использует latest доставит вам неприятности при извлечении последней версии, если вы используете особую идентификацию тегов. Более того, использование короткого идентификатора версии git может быть хорошим решением для внутреннего использования, но при публикации образа докера для общего пользования это может быть не лучшим решением.

Ответы [ 4 ]

1 голос
/ 20 мая 2019

Изображения в докере называются ссылками, наиболее распространенными из которых являются хранилище изображений и тег. И этот тег является относительной свободно сформированной строкой, которая указывает на конкретное изображение. Теги лучше всего рассматривать как изменяемый указатель, его можно изменить, вы можете иметь несколько указателей, указывающих на одно и то же изображение, и его можно удалить, в то время как основное изображение может остаться нетронутым.

Поскольку докер не применяет много структуры к тегам (кроме проверки того, что он содержит допустимые символы и не превышает ограничение длины), применение этого правила остается за каждым сопровождающим хранилища, и в результате появилось много разных решений.


Для сопровождающих репозитория, есть несколько распространенных реализаций:

Вариант A: В идеале сопровождающие хранилища следуют некоторой форме semver . Этот номер версии должен соответствовать версии упакованного программного обеспечения, часто с дополнительным номером патча для ревизии образа. Важно отметить, что изображения, помеченные таким образом, должны включать теги не только для версии 1.2.3-1, но также для 1.2.3, 1.2 и 1, каждое из которых обновляется до последнего выпуска в рамках соответствующей иерархии. Это позволяет последующим пользователям зависеть от версии 1.2 и автоматически получать обновления для 1.2.4, 1.2.5 и т. Д. По мере появления исправлений ошибок и обновлений безопасности.

Вариант B: Подобно приведенному выше параметру semver, многие проекты включают в свои теги другие важные метаданные, например, какая архитектура или базовый образ был использован для этой сборки. Обычно это наблюдается в изображениях Alpine и Debian / Slim, или в коде ARM или AMD. Они часто комбинируются с semver, поэтому вы можете увидеть теги типа alpine-1.5 в дополнение к тегам alpine-1 и alpine.

Вариант C: В некоторых проектах используется более ранняя версия, в которой нет обещаний обратной совместимости. Это часто делается с номерами сборки или строкой даты, и действительно, сам Docker использует это, хотя и с процессом, который не поддерживает функции и не допускает серьезных изменений. Я видел довольно много внутренних проектов, в которых компании используют эту стратегию для создания версий своих изображений, полагаясь на номер сборки с CI-сервера.

Вариант D: Я не очень люблю помещать ревизионные хиты Git в качестве тегов изображений, поскольку они не передают подробности без обращения к репозиторию Git. Не каждый пользователь может иметь такой доступ или умение понимать эту ссылку. И, глядя на два разных хэша, я не представляю, что является более новым или совместимым с моим приложением без внешней проверки. Они также предполагают, что единственный важный номер версии от Git, и игнорируют то, что одна и та же версия Git может использоваться для создания нескольких изображений из разных родительских изображений, разных архитектур или просто нескольких Dockerfiles / многоступенчатых целей в одном и том же репозитории Git. Вместо этого я предпочитаю использовать схему меток и, в конечном итоге, аннотации спецификации изображения , как только мы получим инструменты для обработки аннотаций изображений, для отслеживания таких деталей, как ревизии Git. Это помещает редакцию Git в метаданные, которые вы можете запросить для проверки изображения, но при этом сам тег остается для информации пользователя.


Для пользователей изображений, если у вас есть требование избегать непредвиденных изменений в апстриме, есть два варианта, которые я знаю.

Первый - запустить собственный сервер реестра и перенести внешние зависимости на локальный сервер. Docker включает в себя образ для автономного реестра , который вы можете установить, и открытый API, который позволил многим поставщикам хранилищ артефактов поддерживать реестр докеров. Старайтесь регулярно обновлять этот реестр и включайте способ возврата к предыдущим версиям, если обновление нарушает вашу среду.

Второй вариант - остановить в зависимости от изменяемых тегов. Вместо этого вы можете использовать закрепление изображений, которое ссылается на уникальную ссылку реестра на sha256 на манифест, который нельзя изменить. Вы можете найти это значение в RepoDigests при проверке изображения, полученного с сервера реестра:

$ docker inspect -f '{{json .RepoDigests}}' debian:latest
["debian@sha256:de3eac83cd481c04c5d6c7344cd7327625a1d8b2540e82a8231b5675cef0ae5f"]

$ docker run -it --rm debian@sha256:de3eac83cd481c04c5d6c7344cd7327625a1d8b2540e82a8231b5675cef0ae5f /bin/bash
root@ac9db398dc03:/#

Самый большой риск от привязки к определенному изображению, как это, это отсутствие обновлений безопасности и важных исправлений ошибок. Если вы выберете эту опцию, убедитесь, что у вас есть процедура для регулярного обновления этих изображений.

Независимо от того, какое решение вы используете для извлечения изображений, использование последних полезно только для быстрого тестирования разработчика, а не для каких-либо производственных случаев. Поведение последнего полностью зависит от сопровождающего репозитория, некоторые всегда обновляют его до последнего выпуска, некоторые делают его последним стабильным выпуском, а некоторые вообще забывают его обновить. Если вы зависите от последних версий, вы, скорее всего, столкнетесь с перебоями при смене исходных изображений с версии, подобной 1.5 на 2.0, с изменениями, несовместимыми с предыдущими версиями. Ваше следующее развертывание будет непреднамеренно включать эти изменения, если вы явно не зависите от тега, который обещает исправления ошибок и исправления безопасности без внесения изменений.

1 голос
/ 20 мая 2019

Для меня это все, что я могу сказать, какая версия (моего) программного обеспечения вошла в образ Docker. Я рекомендую использовать что-то вроде короткой версии git ID . Я не использую latest, поскольку он не содержит полезного контекста.

Создайте образ Docker с версией Git в качестве тега. stable-package-name ниже - это просто название вашего приложения, например «HelloWorld» или что-то еще, что вам нравится:

REV_TAG=$(git log -1 --pretty=format:%h)
docker build -t <stable-package-name>:$REV_TAG .

Позже я помещаю то, что я отметил, в удаленный репозиторий:

# nominate the tagged image for deployment
docker tag <stable-package-name>:$REV_TAG <repository-name>:$REV_TAG

# push docker image to remote repository
docker push <repository-name>
1 голос
/ 20 мая 2019

Docker не дает никакого семантического значения для значений тегов.Тег может быть любым строковым значением, и теги можно использовать повторно.Единственное специальное значение тега заключается в том, что если вы просто скажете imagename в команде docker pull или docker run, оно автоматически интерпретируется как imagename:latest.

Механически, вы можете присвоить одному и тому же изображению несколько тегов, но вам нужно docker push всех из них.Дорогой частью толчка является содержание слоя, поэтому в большинстве случаев это просто подталкивает факт наличия альтернативного тега на существующем изображении.Точно так же извлечение тега изображения, если оно является дубликатом изображения, которое у вас уже есть, практически бесплатно, но нет простого способа найти все теги для данного изображения.

Я бы порекомендовал:

  1. Дайте каждые для создания уникального идентификатора, что-то вроде идентификатора коммита управления исходным кодом или отметки времени.
  2. Если и когда вы делаете официальные релизы, также строит тегиэтого выпуска с номером выпуска.(В более общем случае, если текущая фиксация управления исходным кодом помечена, пометьте изображение Docker тегом управления исходным кодом.)
  3. Если это полезно для вашего рабочего процесса разработки, также пометьте сборки, которые являются подсказками ветвей с их ветвью.name.
  4. Учитывая его значимость, вероятно, полезно пометить что-то как latest (возможно, самый последний выпуск).
  5. Избегайте использования latest и других тегов, которые вы ожидаете изменить при обращениидля встроенных изображений (в командах docker run, Dockerfile FROM строк, спецификации модуля Kubernetes, ...).

Эта комбинация может означать, что одно и то же изображение помечено imagename:g1234567, :1.2.3, :master и :latest, и ваша система CI должна выполнить четыре docker push es.Вероятно, вы ожидаете, что первые два изображения будут довольно постоянными, но последние два будут меняться регулярно.После этого вы могли бы с уверенностью запустить что-то вроде imagename:1.2.3.

(Единственный особый случай, который приходит на ум, - это программный пакет, который редко меняется, и, возможно, его необходимо будет перестроить, если имеются вышестоящие исправления или обновления безопасностиКажется типичным повторное использование одного и того же тега для этого: например, ubuntu:18.04 обновляется каждую неделю или две.)

0 голосов
/ 20 мая 2019

Для приложений на основе докеров я помечаю их коротким хешем git commit. Таким образом, вы можете сразу определить код, который находится в контейнере. Я не уверен, как бы я справился с образом докера, созданным для использования в качестве базового образа.

...