Как заставить docker-compose всегда воссоздавать контейнеры из свежих изображений?

Мои изображения докеров построены на сервере Jenkins CI и перенаправлены в наш частный реестр Docker. Моя цель - обеспечить среду с помощью docker-compose, которая всегда запускает первоначально построенное состояние изображений.

В настоящее время я использую docker-compose 1.3.2, а также 1.4.0 на разных машинах, но ранее мы использовали более старые версии.

Я всегда использовал команды docker-compose pull && docker-compose up -d, чтобы извлекать свежие изображения из реестра и запускать их. Я считаю, что мое предпочтительное поведение работало, как ожидалось, до определенного момента времени, но с тех пор docker-compose up начал повторно запускать ранее остановленные контейнеры, а не запускать первоначально созданные изображения каждый раз.

Есть ли способ избавиться от этого поведения? Может ли это быть тот, который подключен в файле конфигурации docker-compose.yml, чтобы не зависеть "не забывая" что-то в командной строке при каждом вызове?

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

Ответ 1

docker-compose up --force-recreate - это один из вариантов, но если вы используете его для CI, я бы начал сборку с помощью docker-compose rm -f, чтобы остановить и удалить контейнеры и тома (затем следовать за ним с помощью pull и up).

Это то, что я использую:

docker-compose rm -f
docker-compose pull
docker-compose up --build -d
# Run some tests
./tests
docker-compose stop -t 1

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

Если вы делаете CI, вы этого не хотите, поэтому просто удалить все, что вам нужно, вы хотите.

Обновление: используйте up --build, который был добавлен в docker-compose 1.7

Ответ 2

Единственное решение, которое сработало для меня, это команда:

docker-compose build --no-cache

Это автоматически вытащит новое изображение из репо и не будет использовать версию кеша, предварительно подготовленную с любыми параметрами, которые вы использовали раньше.

Ответ 3

Вы можете передать --force-recreate в docker compose up, который должен использовать свежие контейнеры.

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

Я не верю, что вы можете заставить это из файла Compose.

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

Ответ 4

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

docker-compose down

Затем, если у вас есть новые изменения на ваших изображениях или Dockerfiles, используйте:

docker-compose build --no-cache

Наконец: docker-compose up

В одной команде: docker-compose down && docker-compose build --no-cache && docker-compose up

Ответ 5

$docker-compose build

Если есть что-то новое, оно будет восстановлено.