У меня есть скрипт, который создает образ докера, загружает его в докер, обновляет docker-compose.yml, а затем вызывает docker compose down и docker compose up. После того, как сервисы Docker compose up воссозданы и сервис, который меня интересует, работает с правильной (новой) версией.
Я не хочу останавливать все службы, которые остановлены docker compose down, я хочу остановить единственную целевую. Я обнаружил, что и docker compose up, и docker compose down поддерживают указание имени службы.
вниз: https://forums.docker.com/t/docker-compose-down-specific-service/125914/8https://docs.docker.com/reference/cli/docker/compose/down/ вверх: https://docs.docker.com/reference/cli/docker/compose/up/
Но когда я звоню docker compose down myservicename в Docker version 25.0.3, я получаю ошибку: unknown command "myservicename" for "docker compose down"
Как остановить (и удалить) только один контейнер? Может быть, есть другой способ «обновить образ» только для одного контейнера?
Просто остановите нужный контейнер с помощью Docker container stop <containername>, затем снова запустите docker-compose up, что воссоздаст те, которые не работают.
@UlrichEckhardt, что я делаю не так? Я создаю скрипт для автоматизации создания образа, переноса его на сервер, где работает докер, и повторного создания контейнера с этой новой версией образа.
Если ваш скрипт вносит изменения в файл docker-compose.yml, повторный запуск docker-compose up -d автоматически удалит и заново создаст изменившиеся контейнеры; вам не нужна команда down или stop вручную.


Вам следует использовать комбинацию команд docker compose stop и docker compose rm, которые позволяют указать имя службы.
Остановите конкретную службу. Во-первых, вам необходимо остановить службу, если она запущена.
docker compose stop myservicename
Удалить остановленный контейнер службы. После остановки службы вы можете удалить ее контейнер.
docker compose rm -f myservicename
Обновите и перезапустите конкретную службу. Теперь, когда конкретная служба остановлена и удалена, вы можете приступить к обновлению ее образа и перезапустить ее.
docker compose up -d --no-deps --build myservicename
Спасибо! А что, если просто вызвать doclker compose up service name, не останавливаясь и не снимая его? Похоже, он также воссоздаст контейнер. Действительно ли мне нужно остановиться и удалить контейнер?
Остановка и удаление контейнера обеспечивает чистый перезапуск без остатков предыдущего экземпляра. Это вопрос предпочтений и необходимости контроля над процессом.
Я нашел следующее решение только что
docker compose up -d servicename, без всякихdocker compose down и docker compose rm.
В ответ получаю:
Container postgressvc Running
Container rabbitmqsvc_3_9_27 Running
Container eventstoredishessvc_23_10_0 Running
Container youmenu_dishes_run Recreate
Container youmenu_dishes_run Recreated
Container youmenu_dishes_run Starting
Container youmenu_dishes_run Started
Operation completed successfully.
Итак, согласно выводам, я могу сделать вывод, что контейнер был воссоздан. Остальные контейнеры работали без перезапуска. Контейнеры в выводе — это контейнеры из раздела «зависит» в docker-compose.yml.
Несмотря на то, что другие говорят, что лучше «остановить и удалить» старый контейнер, перед воссозданием я решил опубликовать этот ответ, возможно, он будет кому-то полезен. В целом я согласен: «остановить и удалить» контейнер обеспечивает чистый перезапуск.
Вы делаете что-то не так, но по той небольшой информации, которую вы предоставляете, невозможно сказать, что именно. Пожалуйста, предоставьте минимально воспроизводимый пример с подробными инструкциями, что вы делаете.