如何通过Docker API获取Docker Stack列表?已查阅相关文档未找到对应方法
通过Docker API获取Docker Stack列表的方法
嘿,我来帮你搞定这个问题!你找不到直接的Docker Stack列表API很正常——因为Stack本质是Docker CLI层面的抽象,底层其实是带特定标签的Swarm服务集合,官方API并没有单独提供Stack列表的端点,但我们可以通过筛选服务标签来实现。
一、使用原生Docker Engine REST API
每个通过docker stack deploy部署的服务,都会自动带上com.docker.stack.namespace标签,标签值就是Stack的名称。我们可以利用这个特性,调用/services接口并添加过滤条件来获取相关服务,再提取去重得到Stack列表。
1. 基础请求(获取带Stack标签的服务)
你可以用curl发送请求(这里假设Docker API监听在本地2375端口,或者用unix套接字unix:///var/run/docker.sock):
curl -X GET "http://localhost:2375/services?filters={%22label%22:{%22com.docker.stack.namespace%22:true}}"
2. 直接提取Stack名称(用jq处理结果)
如果想直接得到去重后的Stack列表,可以用jq工具解析返回的JSON:
curl -s "http://localhost:2375/services?filters={%22label%22:{%22com.docker.stack.namespace%22:true}}" | jq -r '.[].Spec.Labels."com.docker.stack.namespace"' | sort | uniq
二、使用docker-py(Python SDK)
针对你提到的docker-py,同样可以通过筛选服务标签来实现。下面是具体的代码示例:
import docker # 初始化Docker客户端(根据你的API地址调整,本地默认用unix套接字) client = docker.DockerClient(base_url='unix://var/run/docker.sock') # 获取所有带有com.docker.stack.namespace标签的Swarm服务 stack_services = client.services.list(filters={'label': 'com.docker.stack.namespace'}) # 提取并去重Stack名称(用集合自动去重) stack_names = list({service.attrs['Spec']['Labels']['com.docker.stack.namespace'] for service in stack_services}) # 打印结果 print("已部署的Docker Stack列表:", stack_names)
简单解释一下:Stack的核心是一组关联的Swarm服务,每个服务都会携带Stack的命名空间标签,所以只要筛选出带这个标签的服务,提取标签值并去重,就能得到所有的Stack列表了。
内容的提问来源于stack exchange,提问作者Umar Draz
相关产品推荐
相关产品推荐

