Як відновити контейнер докера в docker-compose.yml?


218

Є сфера послуг, яка визначена в docker-compose.yml. Ці послуги були розпочаті. Мені потрібно відновити лише одне з них і запустити його без створення інших служб. Я запускаю такі команди:

docker-compose up -d # run all services
docker-compose stop nginx # stop only one. but it still running !!!
docker-compose build --no-cache nginx 
docker-compose up -d --no-deps # link nginx to other services

Наприкінці я отримав старий контейнер nginx. До речі, docker-compose не вбиває всіх запущених контейнерів!


4
docker-compose up --build
Джинна Балу

Відповіді:


233

докер-складати

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

--no-deps - Не запускайте пов’язані служби.

--build - Створення зображень перед запуском контейнерів.


19
docker-compose build service1 service2 --no-cache робить цю роботу краще ( github.com/docker/compose/isissue/1049 ). У мене були проблеми з кешованими контейнерами, які були побудовані до використання docker-compose up -d --no-deps --build <service_name>
evgpisarchik

33
@evgpisarchik Накази трохи вийшли, це повинно бутиdocker-compose build --no-cache service1 service2
Меттью Вілкокссон

181

З докер-композитом 1.19 up

docker-compose up --build --force-recreate --no-deps [-d] [<service_name>..]

Без одного або декількох service_nameаргументів усі контейнери будуть відновлені

З меню довідки

Options:
    -d, --detach        Detached mode: Run containers in the background,
                        print new container names. Incompatible with
                        --abort-on-container-exit.
    --no-deps           Don't start linked services.
    --force-recreate    Recreate containers even if their configuration
                        and image haven't changed.
    --build             Build images before starting containers.

4
Я розгублений, як це відповідає на питання. Як ми можемо відновити лише один контейнер?
Дункан Джонс

11
Ви можете відновити лише один контейнер, додавши його ім’я до кінця команди. docker-compose up -d --force-recreate --build container_name
HarlemSquirrel

Зачекайте секунду, це відтворює контейнер , це не рівнозначно build --no-cacheваріанту, якщо тільки опис команди не є абсолютно неправильним
Слов'янський

67

Це має вирішити вашу проблему:

docker-compose ps # lists all services (id, name)
docker-compose stop <id/name> #this will stop only the selected container
docker-compose rm <id/name> # this will remove the docker container permanently 
docker-compose up # builds/rebuilds all not already built container 

12
якщо ви хочете stopі rmвсі контейнери, ви можете використовувати команду docker-compose down. Ваше рішення краще, якщо ви хочете лише позбутися деяких.
hirowatari

Це рішення добре підходить для налаштування, коли ви не хочете зупиняти всю програму
докера

Мені потрібно було на самому ділі працювати docker-compose build <id/name>до того, upщоб відновити змінений Dockerfile.
Вайк Гермеч

49

Як опублікував @HarlemSquirrel, це найкраще, і я вважаю правильне рішення.

Але, щоб відповісти на конкретну проблему ОП, це має бути щось на зразок наступної команди, оскільки він не хоче відтворити ВСІ сервіси у docker-compose.ymlфайлі, а лише nginxодну:

docker-compose up -d --force-recreate --no-deps --build nginx

Опис варіантів:

Options:
  -d                  Detached mode: Run containers in the background,
                      print new container names. Incompatible with
                      --abort-on-container-exit.
  --force-recreate    Recreate containers even if their configuration
                      and image haven't changed.
  --build             Build images before starting containers.
  --no-deps           Don't start linked services.

9

Можливо, ці кроки не зовсім правильні, але мені подобається такий:

зупинити докер складати: $ docker-compose down

вийміть контейнер: $ docker system prune -a

почати складати докер: $ docker-compose up -d


4

Просто використовуйте:

docker-compose build [yml_service_name]

Замініть [yml_service_name]ім’я служби у docker-compose.ymlфайлі. Ви можете використовувати, docker-compose restartщоб переконатися, що зміни відбулися. Ви можете --no-cacheігнорувати кеш.


2

Проблема полягає в наступному:

$ docker-compose stop nginx

не працювало (ви сказали, що це все ще працює). Якщо ви все одно збираєтеся його відновити, ви можете спробувати його вбити:

$ docker-compose kill nginx

Якщо це все ще не працює, спробуйте зупинити його безпосередньо докер:

$ docker stop nginx

або видалити його

$ docker rm -f nginx

Якщо це все ще не працює, перевірте свою версію докера, можливо, ви захочете оновити.

Це може бути помилка. Ви можете перевірити, чи відповідає одна вашій системі / версії. Ось пара, наприклад: https://github.com/docker/docker/isissue/10589

https://github.com/docker/docker/isissue/12738

Як вирішення, ви можете спробувати вбити процес.

$ ps aux | grep docker 
$ kill 225654 # example process id

1

Для мене він лише домігся нових залежностей від Docker Hub з обома --no-cacheі --pull(які доступні для docker-compose build.

# other steps before rebuild
docker-compose build --no-cache --pull nginx # rebuild nginx
# other steps after rebuild, e.g. up (see other answers)

0
docker-compose stop nginx # stop if running
docker-compose rm -f nginx # remove without confirmation
docker-compose build nginx # build
docker-compose up -d nginx # create and start in background

Виймання контейнера з rm є важливим. Не виймаючи, Docker запустить старий контейнер.


-9

Тільки:

$ docker-compose restart [yml_service_name]

4
це не призведе до нових змін. з посібника - Якщо ви внесете зміни в конфігурацію docker-compose.yml, ці зміни не будуть відображені після запуску цієї команди.
денів
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.