有没有人知道是否有办法让docker swarm重新启动一个服务而不是重新启动整个堆栈?
答案 0 :(得分:51)
再次为我做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
标志将强制服务更新,导致服务重新启动。
答案 1 :(得分:35)
缩放为0并备份:
docker service scale myservice=0
docker service scale myservice=10
答案 2 :(得分:8)
查看docker stack
文档:
扩展说明
从群组中的撰写或dab文件创建并更新堆栈
来自this blog article:docker stack
的工作方式与docker compose
类似。这是幂等。如果已经部署了堆栈,docker stack deploy
将仅重启那些具有更新的摘要或标记的服务:
根据我的经验,当我通过一次更改服务再次部署相同的堆栈时,只会重新启动更新的服务。
但是...... 似乎对所考虑的更改存在一些限制(某些报告bugs with image tags),因此请尝试一下,看看是否按预期工作。< / p>
如果您希望确定只有目标服务更新后才能使用service update
。
答案 3 :(得分:0)
按照documentation中用于滚动更新的示例:
$ docker服务更新--image redis:3.0.7 redis
但是,仅当您的映像已经在本地计算机上时,此方法才有效。如果不是,那么您需要使用--with-registry-auth将注册表身份验证详细信息发送到swarm代理。在docker service update documentation.
中查看详细信息$ docker服务更新--with-registry-auth --image redis:3.0.7 redis
答案 4 :(得分:-1)
删除它:
docker stack rm stack_name
重新部署它:
docker stack deploy -c docker-compose.yml stack_name