Как перестроить контейнер Docker в 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 не убивает все запущенные контейнеры!

yuklia
источник
4
docker-compose up --build
Джинна Балу

Ответы:

235

докер-сочинять

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

--no-deps - не запускать связанные сервисы.

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

Denov
источник
19
docker-compose build service1 service2 --no-cache делает эту работу лучше ( github.com/docker/compose/issues/1049 ). У меня была проблема с кэшированными контейнерами, которые были созданы перед использованием docker-compose up -d --no-deps --build <service_name>
evgpisarchik
33
@evgpisarchik Заказы немного вышли, это должно бытьdocker-compose build --no-cache service1 service2
Мэтью Уилкоксон
185

С докером-сочинять 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.
HarlemSquirrel
источник
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 
ArgonQQ
источник
12
если вы хотите stopи rmвсе контейнеры, то вы можете использовать команду docker-compose down. Ваше решение лучше, если вы хотите избавиться только от некоторых.
hirowatari
Это решение хорошо подходит для установки, когда вы не хотите останавливать все приложение докера и просто воссоздавать одну из служб
bluesummers
Мне нужно было на самом деле запустить, docker-compose build <id/name>прежде чем upпересобрать измененный Dockerfile.
Вайк Хермеч
50

Как писал @HarlemSquirrel, это лучшее и я думаю правильное решение.

Но, чтобы ответить на конкретную проблему OP, это должна быть что-то вроде следующей команды, так как он не хочет воссоздавать ВСЕ службы в 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.
Славик Мельцер
источник
11

Возможно, эти шаги не совсем корректны, но я делаю так:

остановить докер составить: $ docker-compose down

удалить контейнер: $ docker system prune -a

начать докер составить: $ docker-compose up -d

Сергей Ивченко
источник
Удобно, чтобы очистить весь мусор, который вы собираете ...
Jvenema
4

Просто используйте:

docker-compose build [yml_service_name]

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

FarhadMohseni
источник
2

Проблема в:

$ docker-compose stop nginx

не работал (вы сказали, что он все еще работает). Если вы все равно собираетесь восстановить его, вы можете попробовать убить его:

$ docker-compose kill nginx

Если это все еще не работает, попробуйте остановить его напрямую с помощью Docker:

$ docker stop nginx

или удали это

$ docker rm -f nginx

Если это по-прежнему не работает, проверьте версию Docker, возможно, вы захотите обновить ее.

Это может быть ошибка, вы можете проверить, соответствует ли она вашей системе / версии. Вот пара, например: https://github.com/docker/docker/issues/10589

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

В качестве обходного пути вы можете попытаться убить процесс.

$ ps aux | grep docker 
$ kill 225654 # example process id
user2707671
источник
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)
kmindi
источник
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 запустит старый контейнер.

Nex
источник
-9

Только:

$ docker-compose restart [yml_service_name]
АЛЕКСАНДР ГОМЕС ХИГУИТА
источник
4
это не приведет к новым изменениям. из руководства - если вы внесете изменения в конфигурацию docker-compose.yml, эти изменения не будут отражены после выполнения этой команды.
17