我有一个船坞式作曲。Yml文件包含4个容器:redis, postgres, API和worker。
在工作容器的开发过程中,我经常需要重新启动它以应用更改。有没有什么好方法可以在不重启其他容器的情况下重启单个容器(例如worker) ?
我有一个船坞式作曲。Yml文件包含4个容器:redis, postgres, API和worker。
在工作容器的开发过程中,我经常需要重新启动它以应用更改。有没有什么好方法可以在不重启其他容器的情况下重启单个容器(例如worker) ?
当前回答
重启单个节点的其他答案是on target, docker-compose restart worker。这将反弹该容器,但不包括任何更改,即使您单独重新构建它。您可以手动停止、rm、创建和启动,但还有更简单的方法。
如果你已经更新了你的代码,你可以在一个步骤中使用:
docker-compose up --detach --build
这将首先从任何更改的代码重新构建图像,如果没有更改,这是快速的,因为缓存是重用的。然后它只替换改变的容器。如果你下载的图像是陈旧的,你可以在上面的命令前面加上:
docker-compose pull
首先下载任何更改的图像(容器不会重新启动,直到您运行类似上面的命令)。初次停车是不必要的。
如果只对单个服务执行此操作,请对您想指定的服务执行up或pull命令,例如:
docker-compose up --detach --build worker
下面是第一个选项的快速示例,Dockerfile的结构是将代码中频繁变化的部分保存在末尾。实际上,由于pip安装文件很少更改,因此需求是单独提取的。由于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 stop -t 1 worker
docker-compose build worker
docker-compose up --no-start worker
docker-compose start worker
这很简单:使用命令:
docker-compose restart worker
您可以设置在杀死容器之前等待停止的时间(以秒为单位)
docker-compose restart -t 30 worker
注意,这将重新启动容器,但不会重新构建它。如果您想应用更改,然后重新启动,请查看其他答案。
简单的“docker”命令对“worker”容器一无所知。 使用这样的命令
Docker-compose -f Docker-compose。Yml重启工作
下面的命令
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
重启单个节点的其他答案是on target, docker-compose restart worker。这将反弹该容器,但不包括任何更改,即使您单独重新构建它。您可以手动停止、rm、创建和启动,但还有更简单的方法。
如果你已经更新了你的代码,你可以在一个步骤中使用:
docker-compose up --detach --build
这将首先从任何更改的代码重新构建图像,如果没有更改,这是快速的,因为缓存是重用的。然后它只替换改变的容器。如果你下载的图像是陈旧的,你可以在上面的命令前面加上:
docker-compose pull
首先下载任何更改的图像(容器不会重新启动,直到您运行类似上面的命令)。初次停车是不必要的。
如果只对单个服务执行此操作,请对您想指定的服务执行up或pull命令,例如:
docker-compose up --detach --build worker
下面是第一个选项的快速示例,Dockerfile的结构是将代码中频繁变化的部分保存在末尾。实际上,由于pip安装文件很少更改,因此需求是单独提取的。由于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