429

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

10 回答 10

512

码头工人组成

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

--no-deps - 不启动链接服务。

--build - 在启动容器之前构建图像。

于 2017-03-10T21:59:38.067 回答
342

使用 docker-compose 1.19up

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.

无缓存

要强制重建忽略缓存层,我们必须首先构建一个新图像

docker-compose build --no-cache [<service_name>..]

从帮助菜单

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] [<service_name>..]
于 2018-06-11T16:48:56.360 回答
85

这应该可以解决您的问题:

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 
于 2016-04-27T09:11:54.363 回答
63

正如@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.
于 2018-10-27T07:22:22.480 回答
23

也许这些步骤不太正确,但我确实喜欢这样:

停止泊坞窗撰写:$ docker-compose down

警告:以下prune -a将删除所有图像,您可能不希望这样做,因为它可能会影响其他项目。你可以在这里阅读更多

移除容器:$ docker system prune -a

启动 docker 撰写:$ docker-compose up -d

于 2020-01-23T08:30:47.717 回答
9
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 将启动旧容器。

于 2020-06-18T07:02:17.713 回答
7

对我来说,它只从 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)
于 2019-11-18T18:40:43.150 回答
6

只需使用:

docker-compose build [yml_service_name]

替换为文件[yml_service_name]中的服务名称docker-compose.yml。您可以使用docker-compose restart来确保更改生效。您可以使用--no-cache忽略缓存。

于 2019-07-14T12:23:32.653 回答
4

问题是:

$ 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
于 2016-04-27T09:17:24.640 回答
-12

仅有的:

$ docker-compose restart [yml_service_name]
于 2017-03-02T18:05:36.433 回答