Существует ряд сервисов, определенных в 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 не убивает все запущенные контейнеры !

Ответы (10)

The problem is:

$ docker-compose stop nginx

didn't work (you said it is still running). If you are going to rebuild it anyway, you can try killing it:

$ docker-compose kill nginx

If it still doesn't work, try to stop it with docker directly:

$ docker stop nginx

or delete it

$ docker rm -f nginx

If that still doesn't work, check your version of docker, you might want to upgrade.

It might be a bug, you could check if one matches your system/version. Here are a couple, for ex: https://github.com/docker/docker/issues/10589

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

As a workaround, you could try to kill the process.

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

Как написал @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.

Может быть, эти шаги не совсем правильные, но мне нравится следующее:

остановите docker compose: $ docker-compose down

ПРЕДУПРЕЖДЕНИЕ: Следующая команда prune -a удалит все изображения, вы можете не захотеть этого, так как это может повлиять на другие проекты. вы можете прочитать больше здесь

.

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

запустите docker compose: $ docker-compose up -d

docker-compose up

$ docker-compose up -d --no-deps --build 

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

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

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 запустит старый контейнер.

Особенно:

$ docker-compose restart [yml_service_name]

Это должно решить вашу проблему:

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

Для меня он извлекал новые зависимости из Docker Hub только с помощью --no-cache и --pull (которые доступны для docker-compose build).

# другие шаги перед перестройкой
docker-compose build --no-cache --pull nginx # перестроить nginx
# другие шаги после пересборки, например, поднятие (см. другие ответы)

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

docker-compose build [yml_service_name]

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

С docker-compose 1.19 up

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

Без одного или нескольких аргументов 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.

Без кэша

Чтобы заставить перестройку игнорировать кэшированные слои, мы должны сначала создать новое изображение

.
docker-compose build --no-cache [..]

Из меню справки

Options:
    --force-rm              Always remove intermediate containers.
    -m, --memory MEM        Set memory limit for the build container.
    --no-cache              Do not use cache when building the image.
    --no-rm                 Do not remove intermediate containers after a successful build.

Затем воссоздайте контейнер

docker-compose up --force-recreate --no-deps [-d] [..]

2022 WebDevInsider