如何从现有Docker Swarm集群的stack中提取docker-compose.yml配置?
问题解决方案
一、从现有Stack导出对应YML配置的自动化方法
有两种可行的自动化方案,优先推荐Portainer直接导出的方式,无需额外配置工具:
Portainer界面导出
即便你这个Stack不是通过Portainer创建的,Portainer也能读取Swarm集群的全量运行时配置生成对应YML:
- 登录Portainer后进入对应Swarm集群的「Stacks」列表,点击目标Stack进入详情页
- 切换到「Editor」标签页,Portainer会自动拉取当前Stack下所有服务的实时运行配置,生成符合标准的Docker Compose YML文件,直接复制内容或者点击导出按钮保存即可,生成的配置会包含你部署后对服务做的所有调整,比原始YML更贴合当前实际运行状态。
命令行导出
如果你需要在终端操作,可以用工具批量拉取配置生成YML:
- 先安装
docker-stack-gen工具,执行命令docker-stack-gen <你的Stack名称> > docker-compose.yml即可生成对应配置文件 - 你也可以自己编写jq脚本处理
docker stack inspect <Stack名称>的输出,按照Compose格式规则拼接即可。
二、无需docker stack deploy关联新服务到现有Stack的方法
Docker Swarm的Stack归属完全通过服务标签标记实现,不需要依赖原始YML,也不需要执行docker stack deploy命令,操作方式如下:
Portainer界面操作
新建服务时加对应标签即可:
- 新建服务的配置页面,找到「Labels」配置项,新增一条标签:
键:com.docker.stack.namespace
值:你要关联的目标Stack的名称 - 完成服务创建后,该服务会自动被归类到目标Stack下,Portainer可以正常识别这个关联关系。
命令行操作
创建服务时加上--label参数即可,示例命令:docker service create --label com.docker.stack.namespace=my_target_stack nginx:alpine
执行后创建的nginx服务会自动归属于名称为my_target_stack的现有Stack。
内容的提问来源于stack exchange,提问作者stewartmcgown
相关产品推荐
相关产品推荐

