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

Bry*_*hen 277 docker docker-compose

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

在开发worker期间,我经常需要重新启动它才能应用更改.有没有什么好方法可以重新启动容器(例如worker)而无需重新启动其他容器?

小智 339

这很简单:使用命令:

docker-compose restart worker
Run Code Online (Sandbox Code Playgroud)

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

docker-compose restart -t 30 worker
Run Code Online (Sandbox Code Playgroud)

就这样 !

  • OP表示他需要"重新启动它才能应用更改".根据文档,`docker-compose restart`命令不会应用任何更改."如果对`docker-compose.yml`配置进行了更改,则在运行此命令后不会反映这些更改." 因此使用`docker-compose up -d --build`.https://docs.docker.com/compose/reference/restart/ (14认同)
  • 对我而言,它是有效的,但是如果允许的话,这是一个普遍的问题:"重新启动"是否会处理链接的容器并更新/ etc/hosts,或者"重启"不会更改任何IP? (3认同)
  • nb,* worker *是在yaml文件中为服务提供的名称,而不是运行docker ps -a时看到的任何内容 (3认同)
  • 这个另一个答案要好得多 /sf/answers/2765107761/,因为即使你已经运行了 `docker-compose build <container name>`,`restart` 也不会应用更改,这是一个非- 工作/不正确的答案。 (3认同)
  • 容器按名称链接,通常您需要担心的唯一 IP 是外部 docker 主机 IP(通常为 192.168.99.100)。例如,如果您重新启动其他容器连接到的数据库容器,则可能会出现一些问题。依赖容器必须具有足够的弹性才能重新连接。 (2认同)

BMi*_*tch 143

重新启动单个节点的其他答案都在目标上docker-compose restart worker.这将弹回该容器,但不包括任何更改,即使您单独重建它.您可以手动stop,rm,create,和start,但也有更容易的方法.

如果您已更新代码,则可以通过以下步骤执行构建和重新加载:

docker-compose up --detach --build
Run Code Online (Sandbox Code Playgroud)

这将首先从任何更改的代码重建您的图像,如果自重用缓存后没有任何更改,这将很快.然后它只替换更改的容器.如果下载的图像过时,您可以在上面的命令之前:

docker-compose pull
Run Code Online (Sandbox Code Playgroud)

首先下载任何已更改的图像(在运行上述命令之前,不会重新启动容器up).不需要进行初始停止.

要仅为单个服务执行此操作,请使用您要指定的服务执行up或pull命令,例如:

docker-compose up --detach --build worker
Run Code Online (Sandbox Code Playgroud)

下面是第一个选项的快速示例,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
Run Code Online (Sandbox Code Playgroud)

  • @augustinriedinger如果您的输入文件已更改,并且您使用`COPY`命令包含该文件,则会自动中断缓存. (2认同)

Jef*_*eff 20

要在此处重新启动服务,请执行以下步骤:

docker-compose stop -t 1 worker
docker-compose build worker
docker-compose create worker
docker-compose start worker
Run Code Online (Sandbox Code Playgroud)

  • 如果您需要更改以应用构建,您可以轻松地执行`docker-compose up -d --build`,它将重建所有内容并重新启动任何已更改的容器.首先不需要停止,停机时间以及单独的创建和启动命令. (10认同)
  • 是的,如果要重新启动所有服务,但OP只想重新启动单个服务而不重新启动其他服务 (3认同)
  • 看到我发布的答案,在示例中,`up`只会重新创建已更改的容器,因此需要重新启动. (3认同)

小智 10

重启容器

如果您只想重新启动容器:

docker-compose restart servicename

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

注意事项:

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

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

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

与您的代码的相关性

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

services:

  servicename:
    volumes:
      - .:/code
Run Code Online (Sandbox Code Playgroud)

但我建议使用实时代码重新加载,这可能是由您在调试模式下选择的框架提供的(或者,您可以用您选择的语言搜索自动重新加载包)。添加这个应该可以消除每次代码更改后重新启动容器的需要,而不是重新加载内部进程。


Mr *_*der 9

遵循命令

docker-compose restart worker
Run Code Online (Sandbox Code Playgroud)

将只是停止并启动容器.即,不加载来自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
Run Code Online (Sandbox Code Playgroud)


chu*_*lit 7

由于其他一些答案包括有关重建的信息,并且我的用例也需要重建,因此我有一个更好的解决方案(与那些相比)。

仍然有一种方法可以轻松地仅针对单个worker容器,该容器在一行中重建 + 重新启动它,尽管它实际上不是单个命令。对我来说最好的解决方案就是重建并重新启动

docker-compose build worker && docker-compose restart worker
Run Code Online (Sandbox Code Playgroud)

这对我来说同时实现了两个主要目标:

  1. 针对单个worker容器
  2. 在一行中重建并重新启动它

希望这可以帮助其他人到达这里。


Jin*_*alu 6

使用docker-compose文件重启服务

docker-compose -f [COMPOSE_FILE_NAME].yml restart [SERVICE_NAME]
Run Code Online (Sandbox Code Playgroud)

用例1:如果COMPOSE_FILE_NAME是docker-compose.yml并且服务是工作程序

docker-compose restart worker
Run Code Online (Sandbox Code Playgroud)

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

docker-compose -f sample.yml restart worker
Run Code Online (Sandbox Code Playgroud)

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


Ans*_*rma 6

这里的答案是在谈论 docker-compose.yml 文件上更改的反映。

但是,如果我想将我所做的更改合并到我的代码中,并且我相信只有通过重建图像并且我使用以下命令才能做到这一点,该怎么办

1. docker 容器停止

docker stop container-id
Run Code Online (Sandbox Code Playgroud)

2. docker容器移除

docker rm container-id
Run Code Online (Sandbox Code Playgroud)

3. docker镜像删除

docker rmi image-id
Run Code Online (Sandbox Code Playgroud)

4.再次组合容器

docker-compose up container-name
Run Code Online (Sandbox Code Playgroud)

  • 我认为你应该使用服务密钥而不是容器名称“docker-compose up [service key]” (2认同)

Sht*_*zut 5

简单的'docker'命令对'worker'容器一无所知.使用这样的命令

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

  • 不起作用 - 对coker-compose.yml的新更改未在重新启动时应用 (3认同)

小智 5

要在仅重新启动单个服务的同时应用对 Docker Compose 文件的更改,您可以使用该docker-compose命令up并指定服务名称。例如:

$ docker-compose up -d --no-deps myservice
Run Code Online (Sandbox Code Playgroud)

此命令将更新服务的配置myservice并重新启动它,而不会影响 Compose 文件中的任何其他服务。该-d标志在后台运行服务,并且该--no-deps标志告诉 Compose 不要启动该myservice服务的任何依赖项。

或者,您可以使用以下restart命令重新启动单个服务:

$ docker-compose restart myservice
Run Code Online (Sandbox Code Playgroud)

这将应用该服务的最新配置myservice并重新启动它。

请注意,此命令不会对 Compose 文件本身应用任何更改,它只会使用当前配置重新启动服务。