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

How to restart a single container with docker-compose

我有一个包含 4 个容器的 docker-compose.yml 文件:redispostgresapiworker

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

很简单:使用命令:

docker-compose restart worker

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

docker-compose restart -t 30 worker

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

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

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

要重新启动带有更改的服务,这里是我执行的步骤:

docker-compose stop -t 1 worker
docker-compose build worker
docker-compose up --no-start worker
docker-compose start worker

重启单个节点的其他答案都符合目标,docker-compose restart worker。这将反弹该容器,但不包括任何更改,即使您单独重建它也是如此。您可以手动 stoprmcreatestart,但还有更简单的方法。

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

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

以下命令

docker-compose restart worker

只会停止和启动容器。即不从 docker-compose.xml

加载任何更改

STOP 类似于 PC 的休眠。因此 stop/start 不会查找在配置文件中所做的任何更改。要从容器 (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

使用 docker-compose 文件重新启动服务

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

用例 #1: 如果 COMPOSE_FILE_NAME 是 docker-compose.yml 并且服务是 worker

docker-compose restart worker

用例 #2: 如果文件名是 sample.yml 并且服务是 worker

docker-compose -f sample.yml restart worker

默认情况下,docker-compose 查找 docker-compose.yml 如果我们 运行 docker-compose 命令,否则我们有标志使用 [=17 给出特定文件名=]

重启容器

如果你只想重启你的容器:

docker-compose restart servicename

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

注意事项:

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

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

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

与您的代码的相关性

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

services:

  servicename:
    volumes:
      - .:/code

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

这里的答案是在说docker-compose.yml文件上的变化的反映。

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

1. docker集装箱停靠

docker stop container-id

2。 docker 容器移除

docker rm container-id

3。 docker 图片删除

docker rmi image-id

4.再次组合容器

docker-compose up container-name

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

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

docker-compose build worker && docker-compose restart worker

这对我来说同时完成了两个主要目标:

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

希望这对其他人有所帮助。

进行更改后,您需要将更改拉入服务器,然后重新创建容器。因此,如 documentation 所示:

docker-compose pull worker && docker-compose up -d --no-deps worker

pull worker 只会将此项目拉到服务器,--no-deps 会阻止重新启动 worker 容器所依赖的容器。