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

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

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

363721 次浏览

这很简单:使用命令:

docker-compose restart worker

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

docker-compose restart -t 30 worker

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

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

# EYZ0

要重新启动一个更改的服务,以下是我执行的步骤:

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

重新启动单个节点的其他答案是on target, 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中的休眠。因此,停止/启动将不会查找配置文件中的任何更改。为了从容器的recipe (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]

如果COMPOSE_FILE_NAME是docker-compose.yml, service是worker

docker-compose restart worker

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

docker-compose -f sample.yml restart worker

默认情况下,如果我们运行docker-compose命令,docker-compose会查找docker-compose.yml,否则我们会用-f [FILE_NAME].yml给出特定的文件名

重启容器

如果你想重新启动你的容器:

# EYZ0

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

注意事项:

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

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

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

与代码的相关性

docker-compose restart应该工作得很好,如果你的代码通过docker-compose.yml中的volume指令映射到容器中的路径,就像这样:

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. 在一行中重新构建和重新启动它

希望这能对大家有所帮助。

在进行更改之后,您需要将更改拉入服务器,然后重新创建容器。如文档所示:

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

pull worker将只使这个项目被拉到服务器,而--no-deps将防止重新启动worker容器所依赖的容器。