You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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绑定配置:
    docker service inspect <你的服务名称> --format '{{.Spec.TaskTemplate.ContainerSpec.Secrets}}'
    
    输出内容中可以看到绑定的Secret源名称和目标文件名,确认是否和预期一致

内容的提问来源于stack exchange,提问作者b4too

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:48:00