Как перестроить и обновить контейнер без простоя с помощью docker-compose?

Мне очень нравится использовать docker-compose.

Eg. на моем сервере, когда я хочу обновить мое приложение с небольшими изменениями, мне нужно только git pull origin master && docker-compose restart, отлично работает.

Но иногда мне нужно перестроить (например, я добавил зависимость npm, нужно снова запустить npm install).

В этом случае я делаю docker-compose build --no-cache && docker-compose restart.

Я ожидал бы этого:

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

Но на практике он, похоже, снова перезапускает первый.

Это ожидаемое поведение?

Как я могу обработать перестроение и запустить новый после, который он построил?

Может, я пропустил определенную команду? Или было бы разумно иметь его?

Ответ 1

из руководства перезапуск docker-компоновки

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

вы должны быть в состоянии сделать

$docker-compose up -d --no-deps --build <service_name>

--no-deps не будет запускать связанные службы.

Ответ 2

Проблема в том, что restart перезапустит ваши текущие контейнеры, чего вы не хотите.

В качестве примера я просто сделал это

  • изменить файл докера для одного из изображений
  • вызов docker-compose build для создания изображений
  • вызов docker-compose down 1 и docker-compose up
    • docker-compose restart НЕ будет работать здесь
    • с помощью docker-compose start вместо этого также не работает

Честно говоря, я не совсем уверен, что сначала вам нужно сделать down, но это должно быть легко проверить. 1 В итоге вам нужно позвонить up, Вы увидите, что контейнеры с неизмененными изображениями перезапускаются, но для измененного изображения вы увидите recreating.

Преимущество этого при простом вызове up --build заключается в том, что вы сначала видите процесс сборки перед перезагрузкой.

1: из комментариев; down не требуется, вы можете просто вызвать up --build. Вниз есть некоторые "вниз" -защитные, в том числе возможные деструктивные для ваших (объемных) данных.

Ответ 3

Используйте флаг --build для команды up вместе с флагом -d для запуска ваших контейнеров в фоновом режиме:

docker-compose up -d --build

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

-d предполагает, что вы не хотите, чтобы все выполнялось на переднем плане оболочки. Это делает его более похожим на restart, но это не требуется.

Ответ 4

Не управляйте своей прикладной средой напрямую. Используйте инструмент развертывания, например Rancher. С его помощью вы сможете обновить докционированное приложение без какого-либо простоя и даже понизить его, если вам нужно.

Running Rancher так же просто, как запуск другого контейнера докера, поскольку этот инструмент доступен на концентраторе Docker.