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

Как поддерживать приложения в собственных образах Docker в актуальном состоянии?

Допустим, мой собственный образ Docker основан на образе Debian, и я устанавливаю Apache с помощью RUN apt-get.

Когда базовый образ будет обновлен, мне нужно удалить контейнер и создать новый. Это можно автоматизировать, например со Сторожевой Башней.

Но как я могу поддерживать приложение внутри контейнера (Apache в моем примере) в актуальном состоянии? Базовый образ не меняется только потому, что была устранена проблема безопасности в одном пакете, который не поставлялся с базовым образом. Когда я создаю новый контейнер с моим Dockerfile, Apache по-прежнему не обновляется благодаря кешу изображений Docker.

Как я могу обрабатывать обновления приложений так же просто, как если бы я установил Apache на хосте с помощью диспетчера пакетов?

Вы можете использовать правильное управление конфигурацией с такими системами, как SaltStack, Chef, Ansible или Puppet. Они позволяют точно управлять версиями программного обеспечения, установками, обновлениями и управлять фактическими файлами конфигурации.

Процедура заключается в следующем:

  • Создавайте новые образы. Для шагов, которые меняются, вы можете передать неиспользуемый аргумент сборки в качестве переменной, которая изменяется с каждой сборкой и заставляет кеш-память становиться недействительной. Или вы можете перестроить весь образ с помощью --pull --no-cache параметры, которые также обновляют базовый образ.
  • Сохраните изображения в реестре, если вы запускаете его на нескольких узлах (или запускаете его на другом компьютере, а не на сервере сборки).
  • Обновите работающие контейнеры. С помощью compose вы можете запустить docker-compose pull && docker-compose up -d. С Swarm вы можете запустить docker stack deploy -c compose.yml --with-registry-auth последняя версия будет извлечена из реестра начиная с версии 17.06. Если вы позвоните docker run вручную, тогда вам нужно будет позвонить в соответствующий docker pull сначала (чтобы вытащить образ из реестра), а затем удалите / воссоздайте свой контейнер.

Чтобы автоматизировать все это, для выполнения всех этих шагов будет использоваться инструмент CI-CD, такой как Jenkins, GoCD, Drone.io и т. Д.

Запустите свою «сборку докеров» с помощью «--no-cache --pull», чтобы убедиться, что она всегда использует свежий базовый образ и не пытается повторно использовать кешированные слои для обновлений пакетов.

Вы можете установить комментарий «cache buster» на полпути к вашему Dockerfile (например, в строке, где вы выполняете apt-get), чтобы он всегда работал. Например:

Dockerfile:

ARG CACHEBUST=1
RUN apt-get update && apt-get upgrade # $CACHEBUST

при сборке установите buildarg, например, на текущий PID или $ RANDOM, чтобы всегда строить перестроение из этой строки:

docker --build-arg CACHEBUST=$$

или перестраивать раз в день

docker --build-arg CACHEBUST=`date +%Y%m%d`