运行
docker stack deploy
将一些服务部署到 swarm 后,有没有办法以编程方式测试所有容器是否正确启动?
目的是在临时 CI/CD 管道中验证容器是否实际运行并且在启动时没有失败。通过
restart_policy
禁用重新启动。
我正在查看
docker stack services
,replicas
列对此有用吗?
$ docker stack services --format "{{.ID}} {{.Replicas}}" my-stack-name
lxoksqmag0qb 0/1
ovqqnya8ato4 0/1
是的,有很多方法可以做到这一点,但它是手动的,你必须非常熟悉 docker cli。 Docker 没有提供简单的内置方法来验证
docker stack deploy
是否成功。 有一个关于它的未决问题。
对我们来说幸运的是,社区创建了一些工具来弥补 docker 在这方面的缺点。一些最值得注意的:
Issuu,sure-deploy的作者,有一篇非常好的文章描述了这个问题。
通常在 CI/CD 中,我看到每个人都使用 docker 或 docker-compose。容器在 docker 中的运行方式与 docker swarm 中的运行方式相同,即“该容器是否按预期自行工作”。
话虽如此,如果您仍然想使用 swarm 在多层解决方案中进行集成测试,您可以在自动化中做各种事情。请注意,这一切都将在单个节点群上完成,以使测试更容易(docker events 不会从所有节点提取节点事件,因此对于 ci/cd 来说,跟踪单个节点要容易得多):
docker events -f service=<service-name>
确保容器不会消亡。docker events
中看到它们成功或失败。您可以将它们放入Dockerfiles、服务创建命令和堆栈/撰写文件中。 这里有一些很好的例子。docker inspect <service-id or task-id>
另一种解决方案可能是使用
docker service scale
- 在服务收敛到指定数量的副本或超时之前它不会返回。
export STACK=devstack # swarm stack name
export SERVICE_APP=yourservice # service name
export SCALE_APP=2 # desired amount of replicas
docker stack deploy $STACK --with-registry-auth
docker service scale ${STACK}_${SERVICE_APP}=${SCALE_APP}
该方法的一个缺点是您需要提供服务名称及其副本计数(但可以使用
jq
从撰写规范文件中提取这些内容)。
此外,在我的用例中,我必须通过预先添加
timeout
命令来指定超时,即 timeout 60 docker service scale
,因为即使某些容器失败,docker service scale
也会等待自己的超时,这可能会减慢连续交付管道的速度
自 v26.0 起,
docker stack deploy
和 docker stack rm
支持 --detach
标志,如 docker service create
和 docker service update
:https://docs.docker.com/reference/cli/docker/stack/deploy/
默认为 true,但如果将其设置为 false,它将等待堆栈服务收敛。
docker stack deploy --detach false STACK
您可以为每项服务调用此方法。收敛时返回。 (一切都好)
docker service update STACK_SERVICENAME