Как заставить 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
Если есть что-то новое, оно будет восстановлено.