【发布时间】:2017-12-02 08:57:06
【问题描述】:
有谁知道是否有办法让 docker swarm 重新启动作为堆栈一部分的一项服务,而无需重新启动整个堆栈?
【问题讨论】:
标签: docker docker-compose docker-swarm
有谁知道是否有办法让 docker swarm 重新启动作为堆栈一部分的一项服务,而无需重新启动整个堆栈?
【问题讨论】:
标签: docker docker-compose docker-swarm
为我再次执行docker stack deploy 是更新服务的方法。正如Francois' Answer,根据我自己的经验,这样做只会更新需要更新的服务。
但有时,在测试东西时只重启一个服务似乎更容易。就我而言,我必须清除卷并更新服务才能像新鲜一样启动它。我不确定我将描述的方法是否有缺点。我在我的开发堆栈上对其进行了测试,它对我来说非常有用。
获取您要拆除的服务ID,然后使用docker service update --force <id> 强制更新有效地重新部署它的服务
$ docker stack services <stack_name>
ID NAME ...
3xrdy2c7pfm3 stack-name_api ...
$ docker service update --force 3xrdy2c7pfm3
--force 标志将强制更新服务,导致它重新启动。
【讨论】:
docker service update --force <id> 解决方案是否强制再次读取堆栈/撰写文件?我之所以这样问,是因为我确实想在部署完整堆栈后覆盖服务容器入口点,但仅重新启动单个服务!
yml
缩放到 0 并备份:
docker service scale myservice=0
docker service scale myservice=10
【讨论】:
查看docker stack 文档:
扩展说明
从 swarm 上的 compose 或 dab 文件创建和更新堆栈
来自this blog article:docker stack 的工作方式与docker compose 类似。它是幂等的。如果堆栈已经部署,docker stack deploy 将仅重新启动那些具有更新的摘要或标记的服务:
根据我的经验,当我再次部署相同的堆栈并更改一项服务时,只会重新启动更新后的服务。
但是...考虑到的更改似乎有一些限制(一些报告 bugs with image tags),所以请尝试一下,看看是否按预期工作。
如果您想确保仅针对您的更改进行更新,您也可以使用service update。
【讨论】:
service update 文档,如果没有内置方法,我可以添加/删除env 变量来伪造它。
docker stack deploy 不会启动服务(openldap)。我找不到日志文件。 docker-compose run <service> 将毫无问题地启动容器。最后,docker service update --force <servce>确实工作了。
根据documentation 中的示例进行滚动更新:
$ docker service update --image redis:3.0.7 redis
但是,只有当您的图像已经在本地计算机上时,这才有效。如果没有,那么您需要使用 --with-registry-auth 将注册表身份验证详细信息发送到 swarm 代理。详情见docker service update documentation.
$ docker service update --with-registry-auth --image redis:3.0.7 redis
【讨论】:
删除它:
docker stack rm stack_name
重新部署它:
docker stack deploy -c docker-compose.yml stack_name
【讨论】: