如何使用docker-compose重新启动单个容器


333

我有一个docker-compose.yml包含4个容器的文件:redis,postgres,api,worker

在worker的开发过程中,我经常需要重新启动它才能应用更改。有什么好的方法可以在worker不重新启动其他容器的情况下重新启动容器(例如)?


2
docker-compose -f docker-compose.yml重新启动工作人员
Balu

Answers:


397

非常简单:使用命令:

docker-compose restart worker

您可以设置杀死容器之前等待停止的时间(以秒为单位)

docker-compose restart -t 30 worker

请注意,这将重新启动容器,但不会重建它。如果要应用更改然后重新启动,请查看其他答案。


3
对我来说,它起作用了,但是如果在这里允许的话,这是一个普遍的问题:“重新启动”是否照顾链接的容器并更新/ etc / hosts,还是“重新启动”根本不更改任何IP?
michabbb

容器按名称链接,通常您唯一需要担心的IP是外部docker主机IP(通常为192.168.99.100)。例如,如果您重新启动其他容器连接到的数据库容器,可能会遇到麻烦。从属容器必须具有足够的弹性才能重新连接。
Ryan Kimber

20
OP指出他需要“重新启动它以应用更改”。根据文档,该docker-compose restart命令将不会应用任何更改。“如果您对docker-compose.yml配置进行更改,则在运行此命令后这些更改不会反映出来。” 因此使用docker-compose up -d --builddocs.docker.com/compose/reference/restart
featherbelly

5
nb,worker是yaml文件中为服务提供的名称,而不是运行时看到的任何内容docker ps -a
worc

2
这个其他答案要好得多stackoverflow.com/a/39501539/292408,因为restart即使您已经运行a也不应用更改,这是行不通docker-compose build <container name>/不正确的答案。
伊利亚·林恩

170

重新启动单个节点的其他答案在目标上docker-compose restart worker。这将使该容器退回,但不会进行任何更改,即使您单独重建它也是如此。您可以手动stoprmcreate,和start,但也有更容易的方法。

如果您更新了代码,则可以通过以下步骤一步一步完成构建和重新加载:

docker-compose up --detach --build

这将首先从任何已更改的代码重建图像,如果由于重新使用了缓存而没有任何更改,这将很快。然后,它仅替换已更改的容器。如果下载的图像是陈旧的,则可以在上述命令之前加上以下命令:

docker-compose pull

要首先下载任何更改的图像(除非运行上述命令,否则不会重新启动容器up)。无需进行初始停止。

要仅对单个服务执行此操作,请在up或pull命令后加上要指定的服务,例如:

docker-compose up --detach --build worker

这是第一个选项的快速示例,Dockerfile的结构旨在使频繁更改的代码部分接近尾声。实际上,pip install由于该文件很少更改,因此需求被单独引入。而且由于nginx和redis容器是最新的,因此它们没有重新启动。整个过程的总时间不到6秒:

$ time docker-compose -f docker-compose.nginx-proxy.yml up --detach --build
Building counter
Step 1 : FROM python:2.7-alpine
 ---> fc479af56697
Step 2 : WORKDIR /app
 ---> Using cache
 ---> d04d0d6d98f1
Step 3 : ADD requirements.txt /app/requirements.txt
 ---> Using cache
 ---> 9c4e311f3f0c
Step 4 : RUN pip install -r requirements.txt
 ---> Using cache
 ---> 85b878795479
Step 5 : ADD . /app
 ---> 63e3d4e6b539
Removing intermediate container 9af53c35d8fe
Step 6 : EXPOSE 80
 ---> Running in a5b3d3f80cd4
 ---> 4ce3750610a9
Removing intermediate container a5b3d3f80cd4
Step 7 : CMD gunicorn app:app -b 0.0.0.0:80 --log-file - --access-logfile - --workers 4 --keep-alive 0
 ---> Running in 0d69957bda4c
 ---> d41ff1635cb7
Removing intermediate container 0d69957bda4c
Successfully built d41ff1635cb7
counter_nginx_1 is up-to-date
counter_redis_1 is up-to-date
Recreating counter_counter_1

real    0m5.959s
user    0m0.508s
sys     0m0.076s

这很有趣,但是可以与-no-cache选件一起使用吗?说我向自己添加了一些东西package.json,需要重新输入,RUN npm install但它Dockerfile本身并没有改变
Augustin Riedinger 17/09/29

2
@augustinriedinger如果更改了输入文件,并在COPY命令中包含了该文件,则会自动中断缓存。
BMitch

1
@augustinriedinger谢谢。我在移动,所以看不到链接的问题。从问题的步骤开始,您应该已COPY在Dockerfile中包含命令。在git pull将更新的package.json文件,当码头工人看到你在不同的文件复制构建的缓存将打破。
BMitch

1
谢谢不知道这种行为!我使用的ADD不是,COPY但显然后者是最佳实践,所以我会继续努力!
奥古斯丁·里丁格'17

1
@augustinriedinger ADD的结果将COPY与缓存崩溃的结果相同,但是(如最佳实践链接中所述),大多数不需要额外的功能,因此我什至不用提起它。
BMitch

28

要通过更改重新启动服务,请执行以下步骤:

docker-compose stop -t 1 worker
docker-compose build worker
docker-compose create worker
docker-compose start worker

10
如果您需要更改以应用到构建中,则可以轻松地进行操作docker-compose up -d --build,它将重新构建所有内容并重新启动所有更改的容器。无需先停机,无需停机,并且分别创建和启动命令。
BMitch

4
是的,如果您想重新启动所有服务,但是OP仅想重新启动一个服务而不要重新启动其他服务
Jeff

3
请参阅我发布的答案,在示例中,up只会重新创建已更改的容器,因此需要重新启动。
BMitch

18

跟随命令

docker-compose restart worker

只会停止并启动容器。即不从docker-compose.xml加载任何更改

STOP类似于在PC中休眠。因此,停止/启动将不会在配置文件中查找任何更改。要从容器的配方(docker-compose.xml)重新加载,我们需要删除并创建容器(类似于重启PC)

所以命令如下

docker-compose stop worker       // go to hibernate
docker-compose rm worker        // shutdown the PC 
docker-compose create worker     // create the container from image and put it in hibernate

docker-compose start worker //bring container to life from hibernation

+1,非常感谢!对于rm行选项-f来得心应手(无提示),并与当前的码头工人createstart被合并为up(因此在总我们有3个命令不是4),以及用于up选择-d是有用的(执行是在背景中)。
星际行者

10

使用docker-compose文件重启服务

docker-compose -f [COMPOSE_FILE_NAME].yml restart [SERVICE_NAME]

用例1:如果COMPOSE_FILE_NAME是docker-compose.yml且服务为工作器

docker-compose restart worker

用例2:如果文件名为sample.yml且service为worker

docker-compose -f sample.yml restart worker

默认情况下,docker-compose.yml如果我们运行docker-compose命令,docker-compose将查找,否则,我们将使用以下方式提供标志以指定特定的文件名:-f [FILE_NAME].yml


7

简单的“ docker”命令对“ worker”容器一无所知。使用这样的命令

docker-compose -f docker-compose.yml restart worker


4
不起作用-对coker-compose.yml的新更改未在重新启动时应用
jlee

3

重新启动容器

如果您只想重启容器:

docker-compose restart servicename

将此命令视为“仅按其名称重新启动容器”,相当于 docker restart命令。

注意事项:

  1. 如果您更改了ENV变量,则它们不会在容器中更新。您需要停止它并重新开始。或者,使用单个命令docker-compose up将检测更改并重新创建容器。

  2. 正如许多其他人提到的那样,如果您更改了docker-compose.yml文件本身,则简单的重启将不会应用这些更改。

  3. 如果在构建阶段(Dockerfile使用ADDCOPY命令)将代码复制到容器中,则每次代码更改时,都必须重新构建容器(docker-compose build)。

与您的代码相关

docker-compose restart如果代码通过volume指令将路径映射到容器中,则应该可以正常工作docker-compose.yml

services:

  servicename:
    volumes:
      - .:/code

但是我建议您使用实时代码重装,它可能是由您选择的框架在DEBUG模式下提供的(或者,您可以使用您选择的语言搜索自动重装软件包)。添加此选项后,您无需在代码更改后每次都重新启动容器,而需要在内部重新加载进程。


1

答案在这里是关于docker-compose.yml文件中更改的反映。

但是,如果我想将自己所做的更改合并到代码中,该怎么办?我相信只有通过重建映像并使用以下命令才能实现

1.码头集装箱停靠站

docker stop container-id

2.移除docker容器

docker rm container-id

3.移除docker映像

docker rmi image-id

4.重新组成容器

docker-compose up container-name
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.