有谁知道是否有办法让docker swarm重新启动属于堆栈一部分的一项服务而不重新启动整个堆栈?
Answers:
这样做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 stack
文档:
扩展说明
从群集上的compose或dab文件创建和更新堆栈
摘自这篇博客文章:docker stack
与docker compose
。这是幂等的。如果已经部署了堆栈,docker stack deploy
则将仅重新启动具有摘要或标记已更新的那些服务:
根据我的经验,当我在更改一项服务的情况下再次部署同一堆栈时,只会重新启动更新的服务。
但是...考虑到的更改似乎有一些限制(某些带有图像标签的报告错误),因此请尝试一下,看看是否能按预期工作。
service update
如果您要确保仅针对目标服务进行了更改更新,则也可以使用。
service update
文档env
,如果没有内置的方式,我可以添加/删除变量以伪造出来。
docker stack deploy
无法启动服务(openldap)。我找不到日志文件。docker-compose run <service>
会毫无问题地启动容器。最后,docker service update --force <servce>
做了工作。
按照用于滚动更新的文档中的示例:
$ docker服务更新--image redis:3.0.7 redis
但是,仅当您的映像已经在本地计算机上时,这才起作用。如果不是,则需要使用--with-registry-auth将注册表身份验证详细信息发送到swarm代理。请参阅docker服务更新文档中的详细信息。
$ docker服务更新--with-registry-auth --image redis:3.0.7 redis
去掉它:
docker stack rm stack_name
重新部署:
docker stack deploy -c docker-compose.yml stack_name