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


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不会杀死所有正在运行的容器!


3
docker-compose up --build
Jinna Balu

Answers:


232

码头工人组成

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

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

--build-在启动容器之前生成映像。


19
docker-compose build service1 service2 --no-cache 做得更好(github.com/docker/compose/issues/1049)。我在使用之前构建的缓存容器存在问题 docker-compose up -d --no-deps --build <service_name>
evgpisarchik,2017年

32
@evgpisarchik命令有点出来,应该是docker-compose build --no-cache service1 service2
Matthew Wilcoxson

180

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

4
我很困惑这如何回答这个问题。我们如何只重建一个容器?
邓肯·琼斯

11
您可以通过在命令末尾附加名称来重建一个容器。docker-compose up -d --force-recreate --build container_name
HarlemSquirrel

等待一秒钟,这将重新创建container,它不等同于build --no-cacheoption,除非命令描述完全错误
Slav

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
如果你想stoprm所有的容器,那么你可以使用命令docker-compose down。如果您只想摆脱一些问题,那么您的解决方案会更好。
hirowatari

此解决方案非常适合您不想停止整个docker应用程序并仅重新创建其中一项服务的设置
bluesummers

docker-compose build <id/name>up重建更改的Dockerfile 之前,我需要实际运行。
Vajk Hermecz

49

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


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停止它:

$ 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

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配置进行更改,则在运行此命令后这些更改将不会反映出来。
denov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.