我有一个船坞式作曲。Yml文件包含4个容器:redis, postgres, API和worker。
在工作容器的开发过程中,我经常需要重新启动它以应用更改。有没有什么好方法可以在不重启其他容器的情况下重启单个容器(例如worker) ?
我有一个船坞式作曲。Yml文件包含4个容器:redis, postgres, API和worker。
在工作容器的开发过程中,我经常需要重新启动它以应用更改。有没有什么好方法可以在不重启其他容器的情况下重启单个容器(例如worker) ?
当前回答
由于其他一些答案包含关于重新构建的信息,并且我的用例也需要重新构建,所以我有一个更好的解决方案(与那些相比)。
仍然有一种方法可以轻松地在一行中只针对一个工作容器进行重建+重启,尽管它实际上不是一个命令。对我来说,最好的解决方案就是重建和重启:
docker-compose build worker && docker-compose restart worker
这同时实现了我的两个主要目标:
目标是单个工作者容器 在一行中重新构建和重新启动它
希望这能对大家有所帮助。
其他回答
重启容器
如果你想重新启动你的容器:
Docker-compose restart servicename
可以将此命令视为“按名称重新启动容器”,这相当于docker restart命令。
注意事项:
如果你改变了ENV变量,它们不会在容器中更新。你得停下来,重新开始。或者,使用单一命令docker-compose up将检测更改并重新创建容器。 正如许多人提到的,如果更改docker-compose。Yml文件本身,简单的重新启动不会应用这些更改。 如果你在构建阶段将代码复制到容器中(在Dockerfile中使用ADD或copy命令),每次代码更改时,你都必须重新构建容器(docker-compose build)。
与代码的相关性
如果你的代码在Docker-compose中通过volume指令映射到容器中,那么Docker-compose重启应该可以正常工作。你是这样的:
services:
servicename:
volumes:
- .:/code
但是我建议使用实时代码重新加载,这可能是由您所选择的框架在DEBUG模式下提供的(或者,您可以搜索所选择语言的自动重新加载包)。添加这个可以消除每次代码更改后重新启动容器的需要,而不是在里面重新加载进程。
这很简单:使用命令:
docker-compose restart worker
您可以设置在杀死容器之前等待停止的时间(以秒为单位)
docker-compose restart -t 30 worker
注意,这将重新启动容器,但不会重新构建它。如果您想应用更改,然后重新启动,请查看其他答案。
要在只重新启动单个服务的情况下对Docker Compose文件应用更改,可以使用Docker - Compose命令和up命令并指定服务名称。例如:
$ docker-compose up -d --no-deps myservice
这个命令将更新myservice服务的配置并重新启动它,而不会影响撰写文件中的任何其他服务。-d标志在后台运行服务,——no-deps标志告诉Compose不要启动myservice服务的任何依赖项。
您也可以使用restart命令重新启动单个服务:
$ docker-compose restart myservice
这将应用myservice服务的最新配置并重新启动它。
注意,该命令不会对Compose文件本身应用任何更改,它只会使用当前配置重新启动服务。
使用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和服务是工人
docker-compose -f sample.yml restart worker
默认情况下,docker-compose查找docker-compose。如果我们运行docker-compose命令,那么我们可以用-f [FILE_NAME].yml标记指定文件名
在进行更改之后,您需要将更改拉入服务器,然后重新创建容器。如文档所示:
docker-compose pull worker && docker-compose up -d --no-deps worker
Pull worker将只将这个项目拉到服务器,而——no-deps将防止重新启动工作者容器所依赖的容器。