Як відновити контейнер докера в 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.