У меня несколько микросервисов, и я использую 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


Контейнеры Docker спроектированы так, чтобы быть эфемерными. Чтобы обновить существующий контейнер, вы удаляете старый и запускаете новый. Таким образом, процесс, которому вы следуете, является правильным.
Вы можете упростить команды до следующих:
docker-compose up --force-recreate --build -d
docker image prune -f
Я думаю, что флаг важен, так как не добавление его приведет к запуску всего на переднем плане, убивая все, как только сеанс завершится. Добавил, столько (большинство?) Людей сочтут -d полезным / необходимым.
Похоже, здесь отсутствует шаг docker-compose pull. --force-recreate не загружает обновленные образы; он просто воссоздает контейнеры даже если изображения не изменились.
С docker-compose версии 3 вы можете добавлять теги к своим изображениям и очищать их в зависимости от вашей логики:
build: ./dir
image: yourapp:tag
Это может помочь вам избежать анонимных изображений для очистки
Вы можете обновить его, используя:
docker-compose pull
Теперь ваше изображение обновлено. Если у вас работает предыдущая версия контейнера, вам следует перезапустить ее, чтобы использовать обновленный образ:
docker-compose restart
Просто запуск этого не обновил для меня контейнер. Вам не хватает части для повторного запуска. См. stackoverflow.com/a/39501539/1452257, который у меня сработал.
@pir Я добавил пояснение.
перезапуск не работает, потому что он не воссоздает контейнер из вытягивания, вам придется снова выполнить down и up -d.
В моем случае он воссоздается автоматически.
Я думаю, что комбинация комментария @ yamenk и этого - лучший способ пойти
@EvgenBodunov «В моем случае он воссоздается автоматически» Это классический вариант «Работает на моем компьютере». Не очень круто!
@ hoo2 Не хотите ли вы улучшить мой ответ, опишите, пожалуйста, когда контейнер автоматически обновляется из изображения, а когда нет. Честно говоря, я не знаю и не могу улучшить ответ. "Не очень круто!" само по себе не круто.
Действительно, у меня тоже перезагрузка не прошла. Пришлось сочинить вниз и вверх -d. Примечание, работающее на centos 7.9 из официальных репозиториев docker-ce.
Я предпочитаю убедиться, что все изображения загружены, прежде чем обновлять контейнеры новыми изображениями, чтобы минимизировать время в промежуточном состоянии или, что еще хуже, в промежуточном состоянии в случае сбоя загрузки изображения.
1) Вытаскиваю последние изображения:
docker-compose pull
2) Затем перезапускаю контейнеры:
docker-compose up -d --remove-orphans
3) При желании удаляю устаревшие изображения:
docker image prune
Мне нравится этот ответ, потому что он не заставляет использовать -f или --force-recreate, которые могут иметь деструктивные побочные эффекты.
docker-compose pull
тогда
docker-compose up -d
вам не нужно "вниз" "docker-compose up -d" воссоздаст только измененный
Просто и понятно
Если у вас нет томов, это нормально, но если вы сделаете это, он их удалит. Так что на самом деле это не обновление.
Вы пропустили флаг -d в команде docker-compose; это умышленно?