Как перестроить и обновить контейнер без простоя с помощью 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.