Docker Swarm下使用Compose配置secrets后容器无法找到对应秘钥问题求助
Docker Swarm Secret 无法挂载问题排查
常见错误原因
以下是该场景下最高发的配置错误:
- 部署Stack时未选择Swarm集群环境:Portainer中独立Docker环境无法识别Swarm级别的Secret资源,若部署时误选本地环境会直接导致Secret找不到
- Compose文件缺少
external标识:若Secret是提前在Portainer中创建的,必须在Compose的全局secrets段中声明external: true,否则Swarm会尝试为当前Stack自动创建新的同名Secret,不会复用已有资源 - 未配置Secret挂载目标文件名:默认情况下Swarm会将Secret以和Portainer中创建的Secret同名的文件名挂载到
/run/secrets/下,若你代码中读取的文件名是db_passwd,但Portainer中创建的Secret名称为db_pass,没有显式指定target的话就会出现文件不存在的报错 - 服务未绑定Secret:Compose中必须在对应服务的配置段下单独声明要挂载的Secret列表,仅在全局
secrets段声明不会自动挂载到服务中
正确配置示例
参考配置如下,注意对应字段的配置逻辑:
version: '3.8' services: wiki: image: your-wiki-image environment: - DB_PASS_FILE=/run/secrets/db_passwd # 服务级绑定Secret secrets: - source: db_pass # 此处对应Portainer中已创建的Secret的实际名称 target: db_passwd # 此处对应/run/secrets下生成的文件名,和你代码中读取的路径保持一致 secrets: # 全局段声明使用外部已创建的Secret db_pass: external: true
额外排查建议
- 你使用的Portainer 2.6.3版本存在已知的Stack更新Secret丢失问题,建议删除原有Stack后重新新建部署,不要使用编辑更新功能
- 部署完成后可在宿主机执行以下命令验证Secret绑定配置:
输出内容中可以看到绑定的Secret源名称和目标文件名,确认是否和预期一致docker service inspect <你的服务名称> --format '{{.Spec.TaskTemplate.ContainerSpec.Secrets}}'
内容的提问来源于stack exchange,提问作者b4too
相关产品推荐
相关产品推荐

