我有一个包含一个管理器和另一个普通节点的 swarm 集群,当我创建一个 swarm 服务时,我使用挂载类型、挂载源和挂载目标进行创建。它在管理器和节点中创建具有相同名称的卷并启动容器,我的服务启动了。
当我发布服务时,与服务一起创建的卷没有被删除,这仍然没问题。
我面临的问题是,当我删除具有相同端点的卷时,它只是删除 swarm manager 中的卷,创建服务时在节点中创建的卷仍然存在。
我希望管理员删除与 swarm 服务一起创建的所有卷。有办法吗??
经过这么多分析,这是理论。
如果您指示 swarm 创建带有卷的服务,Swarm 仅执行在集群内创建服务的操作,即在多个节点上是的,当您发送卷详细信息时是的,它也会创建卷,但在释放服务时它在释放时无法检查工作节点是否存在卷,这是 docker 中的错误
我已经在docker中提出了这个bug。
目前除了在释放 swarm 服务后手动从工作节点释放卷之外没有其他方法。
据我所知,卷仅在创建容器的节点上创建。您的服务是否有可能无法在一个节点上启动,最终在另一个节点上结束,并且不知何故 swarm 无法清理?如果是这样的话,请在 github 中写一个问题。
更新(来自评论):
根据docker服务创建文档:
命名卷是一种将容器所需的持久数据与用于创建容器的映像和主机解耦的机制。命名卷由 Docker 创建和管理,即使当前没有容器使用命名卷,它也会持续存在。命名卷中的数据可以在容器和主机之间以及多个容器之间共享。 Docker 使用卷驱动程序来创建、管理和挂载卷。您可以使用 Docker 命令备份或恢复卷。
因此,如果您使用命名卷,正确的答案是为什么它们在管理器上被删除以及它们在那里创建的位置?
有一种方法可以删除 docker swarm 集群的其他机器中的卷。
考虑到卷名称是
volume-x
,您可以运行以下命令:
docker service create -d \
--name cleaner \
--restart-condition none \
--mode global \
--mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock \
docker \
sh -c "docker volume rm volume-x"
它将创建一个全局服务并在集群内的每个主机中运行
docker volume rm volume-x
关注日志:
docker service logs --follow cleaner
moby/moby
第29158期时,Andrey Mikhailov在该同一期中建议:
与此同时,以下是管理跨 swarm 集群的悬空卷删除的简单方法:
version: '3.9' services: swarm-volumes-cleanup: image: "docker:26.1.4-cli" volumes: - /var/run/docker.sock:/var/run/docker.sock environment: NODE_ID: "{{.Node.ID}}" deploy: mode: global-job restart_policy: condition: none entrypoint: - sh - -c - | set -xe docker volume ls --filter name="${FILTER_NAME}" --filter "dangling=true" -q | xargs -r docker volume rm echo Done - $$NODE_ID
FILTER_NAME="test-infra_" docker stack deploy --detach=false --compose-file tasks/swarm-volumes-cleanup.yml maintenance