2015-09-16 1 views
85

Мои изображения докеров построены на сервере 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 заключается в создании неизменной инфраструктуры. Нынешнее поведение докер-сочинения просто похоже на столкновение с этим подходом .. или я пропустил некоторые моменты здесь?

ответ

101

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, вы этого не хотите, поэтому просто удалите все, что вам нужно.

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

+1

Да, на самом деле это то, что я делаю и в CI. Не уверен, почему я не упоминал об этом ... –

+0

@ dnephin 'docker-compose run -d' не существует? Вы хотите сказать 'docker-compose up -d' no? –

+1

, если вы запускаете '' 'docker-compose pull''' перед' '' docker-compose rm -f''' вы можете сэкономить еще больше времени. – stephanlindauer

12

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

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

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

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

+0

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

+3

'-force-recreate' не работает для меня ... Изображение не вытаскивается, даже если новая версия там ... – lisak

+0

@lisak Я никогда не говорил, что он вытащил новые изображения. Это не так. Он просто запускает новые контейнеры, используя любое изображение, доступное локально. Вам нужно будет вручную запустить докер. –

-2
$docker-compose build 

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

34

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

docker-compose build --no-cache 

Это будет автоматически тянуть свежий образ из репо и не будет использовать версию кэша, который prebuild с любыми параметрами, которые вы уже использовали раньше ,

13

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

docker-compose down 

Тогда, если у вас есть новые изменения на изображениях или Dockerfiles использовать:

docker-compose build --no-cache 

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

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