Назад | Перейти на главную страницу

Является ли хорошей практикой помещать операторы обновления / обновления в Dockerfile?

здесь новичок в Docker, и я пытаюсь исправить это.

Я хочу создать докер-контейнер, чтобы «заморозить» приложение, созданное с помощью сценариев bash и множества зависимостей, чтобы мне больше не приходилось его поддерживать. Думаю, докер мне в этом поможет. Является ли хорошей практикой помещать операторы обновления / обновления в файл Docker, такие как «apt-get upgrade»? Разве это не приведет к поломке приложения в будущем, а докер должен предотвратить это?

Основная причина, по которой вы захотите либо использовать обновленный базовый образ (который, в свою очередь, был создан из последних пакетов), либо обновить его самостоятельно (например, apt-get upgrade), чтобы получить исправления безопасности, а также другие исправления ошибок.

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

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

С точки зрения безопасности это, конечно, подразумевает регулярные выпуски.

Что касается того, что вы получите с точки зрения обновленных пакетов в Debian (если мы предполагаем Debian, от использования вами apt-get), у них есть стабильный (т.е. неизменные) релизы. То есть они не поставляют новые версии упакованного программного обеспечения (за редкими исключениями), но исправляют обратную связь с их упакованной версией.
Это может быть полезно в ваших усилиях по «глубокой заморозке», поскольку вероятность изменения поведения намного ниже, чем в новых версиях.

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

Что касается обновления, я бы не предлагал его, если вы действительно хотите «заморозить» его. Лучше всего начать с apt update а затем установите определенные версии ваших зависимостей, чтобы вы не получили несовместимую версию в какой-то момент в будущем.

Кроме этого - да, работает apt в контейнерах - это нормально, когда у вашего приложения есть зависимости, которые не обязательно должны находиться в собственных контейнерах.

Ты прав, apt-get upgrade конечно, будет обновлять пакеты в будущем, но что вы пытаетесь сделать с Dockerfile заключается в создании контейнера докеров в правильном состоянии. После создания образа докера он замораживается, и apt-get upgrade больше не будет работать.

Если вы пересобираете свой образ, то, конечно, пакеты обновляются, ну, не используйте apt-get upgrade !. Вам нужно только бежать apt-get update чтобы обновить список пакетов.

Итак, что вам нужно сделать, это запустить apt update when building, затем установите определенные версии каждого необходимого пакета:

apt-cache madison openssl openssl | 1.1.0f-3+deb9u2 | http://deb.debian.org/debian stretch/main amd64 Packages openssl | 1.1.0f-3+deb9u2 | http://security.debian.org/debian-security stretch/updates/main amd64 Packages

Итак, для установки openssl 1.1.0f-3+deb9u2 , делать apt-get install openssl=1.1.0f-3+deb9u2.

Вам нужно будет сделать это для каждого пакета, которому нужна определенная версия.

Другой способ - не бежать apt-get update вообще, но с Debian пакеты обновляются из-за проблем с безопасностью, а затем больше не доступны на обычных сайтах распространения, так что это может сломать ваш docker build в будущем. В зависимости от того, как построены ваши скрипты, и от необходимых зависимостей, возможно, стоит попробовать. Поскольку создание образов не требует дополнительных затрат (больше, чем место на диске), попробуйте оба варианта!

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

Обновление потребуется только в том случае, если ваш базовый образ поставляется со старым пакетом. Вместо того, чтобы запускать обновление, вам следует перестроить базовый образ или загрузить новую версию этого базового образа с более новыми пакетами. Это не только даст вам обновления, которые были применены к исходным изображениям, но и уменьшит размер вашего образа, поскольку вам не нужны и старая, и новая версия пакета (многоуровневая файловая система Docker не удаляет полностью замененные или удаленные файлы. в родительских образах).

По стабильности вижу два варианта:

  1. Установите определенные версии пакетов с помощью pkg=ver синтаксис. Возможно, вы захотите сделать это с конкретными пакетами, а остальным разрешить установить последнюю версию. Если вы это сделаете, я бы рекомендовал передать версию пакета в качестве аргумента сборки, чтобы его можно было легко обновить.

  2. Установите все самое последнее, но всегда обновляйте свой образ, чтобы в случае возникновения проблем можно было вернуться к предыдущему тегу образа.

Часто вы в конечном итоге делаете и то, и другое, но самый большой риск для №1 - это забыть обновить до новых выпусков с безопасностью и исправлениями ошибок.