如何在docker-compose.yml中重建docker容器?

docker-compose.yml中定义了服务范围。这些服务已经启动。我只需要重新构建其中一个,并在不启动其他服务的情况下启动它。

.执行如下命令
docker-compose up -d # run all services
docker-compose stop nginx # stop only one. but it is still running !!!
docker-compose build --no-cache nginx
docker-compose up -d --no-deps # link nginx to other services
最后,我得到了旧的nginx容器。 Docker-compose不会杀死所有正在运行的容器!< / p >
711831 次浏览

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

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

问题是:

$ docker-compose stop nginx

没有工作(你说它还在运行)。如果你无论如何都要重建它,你可以尝试杀死它:

$ docker-compose kill nginx

如果它仍然不工作,尝试直接用docker停止它:

$ docker stop nginx

或者删除它

$ docker rm -f nginx

如果这仍然不起作用,检查docker版本,您可能需要升级。

这可能是一个错误,你可以检查是否有一个与你的系统/版本匹配。以下是一些例子: https://github.com/docker/docker/issues/10589 < / p >

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

作为一种解决方案,您可以尝试终止该进程。

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

只有:

$ docker-compose restart [yml_service_name]

docker-compose up

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

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

——build——在启动容器之前构建镜像。

使用docker-compose 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.

没有缓存

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

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>..]

正如@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.

简单地使用:

docker-compose build [yml_service_name]

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

对我来说,它只从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)

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

停止docker编写:$ docker-compose down

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

删除容器:$ docker system prune -a

start docker compose: $ docker-compose up -d

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 build

如果你正在使用docker配置文件:

docker-compose --profile profile_name build