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

У меня несколько микросервисов, и я использую docker-compose для развертывания в разработке. Когда в базе кода микросервисов происходят некоторые изменения, я запускаю задание ci для их повторного развертывания. Для этого у меня есть сценарий ниже. Но каждый раз мне приходится создавать все образы с нуля, а затем запускать их. После всей этой операции у меня остались образы anonymous. Поэтому я использую последний скрипт для их удаления. Что бы вы посоветовали сделать этот процесс более практичным? Есть ли способ обновить существующее изображение, не удаляя его новыми изменениями?

- docker-compose build
- docker-compose down
- docker-compose up -d --force-recreate
- docker rmi $(docker images -f "dangling=true" -q) -f

Дополнительная информация: я использую gitlab-ci

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
95
0
114 604
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Контейнеры Docker спроектированы так, чтобы быть эфемерными. Чтобы обновить существующий контейнер, вы удаляете старый и запускаете новый. Таким образом, процесс, которому вы следуете, является правильным.

Вы можете упростить команды до следующих:

docker-compose up --force-recreate --build -d
docker image prune -f

Вы пропустили флаг -d в команде docker-compose; это умышленно?

Vince Bowdren 23.03.2018 18:19

Я думаю, что флаг важен, так как не добавление его приведет к запуску всего на переднем плане, убивая все, как только сеанс завершится. Добавил, столько (большинство?) Людей сочтут -d полезным / необходимым.

xdevs23 02.05.2020 23:24

Похоже, здесь отсутствует шаг docker-compose pull. --force-recreate не загружает обновленные образы; он просто воссоздает контейнеры даже если изображения не изменились.

Ryan Lue 02.03.2021 19:54

С docker-compose версии 3 вы можете добавлять теги к своим изображениям и очищать их в зависимости от вашей логики:

build: ./dir
image: yourapp:tag

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

Вы можете обновить его, используя:

docker-compose pull

Теперь ваше изображение обновлено. Если у вас работает предыдущая версия контейнера, вам следует перезапустить ее, чтобы использовать обновленный образ:

docker-compose restart

Просто запуск этого не обновил для меня контейнер. Вам не хватает части для повторного запуска. См. stackoverflow.com/a/39501539/1452257, который у меня сработал.

pir 04.10.2019 19:57

@pir Я добавил пояснение.

Evgen Bodunov 14.11.2019 09:30

перезапуск не работает, потому что он не воссоздает контейнер из вытягивания, вам придется снова выполнить down и up -d.

Ciantic 14.03.2020 21:34

В моем случае он воссоздается автоматически.

Evgen Bodunov 17.03.2020 10:06

Я думаю, что комбинация комментария @ yamenk и этого - лучший способ пойти

xdevs23 20.04.2020 10:52

@EvgenBodunov «В моем случае он воссоздается автоматически» Это классический вариант «Работает на моем компьютере». Не очень круто!

hoo2 23.03.2021 13:39

@ hoo2 Не хотите ли вы улучшить мой ответ, опишите, пожалуйста, когда контейнер автоматически обновляется из изображения, а когда нет. Честно говоря, я не знаю и не могу улучшить ответ. "Не очень круто!" само по себе не круто.

Evgen Bodunov 24.03.2021 14:06

Действительно, у меня тоже перезагрузка не прошла. Пришлось сочинить вниз и вверх -d. Примечание, работающее на centos 7.9 из официальных репозиториев docker-ce.

ionescu77 10.05.2021 13:17

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

1) Вытаскиваю последние изображения:

docker-compose pull

2) Затем перезапускаю контейнеры:

docker-compose up -d --remove-orphans

3) При желании удаляю устаревшие изображения:

docker image prune

Мне нравится этот ответ, потому что он не заставляет использовать -f или --force-recreate, которые могут иметь деструктивные побочные эффекты.

kravemir 05.09.2020 10:27
docker-compose pull

тогда

docker-compose up -d

вам не нужно "вниз" "docker-compose up -d" воссоздаст только измененный

Просто и понятно

Leafney 04.12.2020 02:56

Если у вас нет томов, это нормально, но если вы сделаете это, он их удалит. Так что на самом деле это не обновление.

chunk1ty 29.12.2020 15:08

Другие вопросы по теме