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

Docker Compose使用Secrets加密密码时遇部署错误求助

解决Docker Compose Secrets部署错误的方案

我来帮你搞定这个Docker Secrets的问题,你遇到的两个错误主要是命令格式错误和Compose文件中Secrets的定义规范不符导致的,咱们一步步来修复:

首先纠正你的部署命令

你执行的命令:

$ docker stack deploy --compose-file=docker-compose-stack-dev.yml secret secrets

是错误的。docker stack deploy的正确格式是指定Compose文件和栈名称,不需要额外的secret secrets参数。正确命令应该是:

$ docker stack deploy --compose-file=docker-compose-stack-dev.yml my-dev-stack

把my-dev-stack换成你自己想要的栈名称即可。

分析并修复Compose文件的Secrets定义

错误1:version 3时提示Additional property secrets is not allowed

Docker Compose version 3 本身支持Secrets,但有个限制:只能引用预先通过docker secret create创建好的外部Secret,不能在Compose文件里直接定义Secret的内容(比如密码文本)。如果你的Compose文件里直接写了Secret的内容字段,就会触发这个错误。

正确的version 3写法(引用外部已创建的Secret):

  1. 先提前创建Secret:
    比如把密码存入一个本地文件db_password.txt,然后创建Secret:
    $ echo "你的加密密码内容" > ./db_password.txt
    $ docker secret create db_password ./db_password.txt
    
  2. 编写version 3的Compose文件:
    version: '3'
    services:
      # 你的服务定义,比如数据库或应用服务
      my_app:
        image: your-app-image:latest
        # 引用需要的Secret
        secrets:
          - db_password
        # 其他服务配置...
    
    # 顶层定义Secrets,指定为外部已创建的
    secrets:
      db_password:
        external: true
    

错误2:version 3.1时提示my_secret_data Additional property my_secret_data is not allowed

这个错误是因为你在定义Secret时格式不对——version 3.1+允许在Compose文件里直接定义Secret内容,但必须通过file(指向本地密码文件)或data(base64编码的密码字符串)字段来声明,不能直接把密码值写在Secret名称后面。

正确的version 3.1+写法(两种方式):

方式1:从本地文件加载Secret内容
version: '3.1'
services:
  my_app:
    image: your-app-image:latest
    secrets:
      - db_password
    # 其他服务配置...

secrets:
  db_password:
    # 指向存储密码的本地文件(路径相对于Compose文件所在目录)
    file: ./db_password.txt

部署时,docker stack deploy会自动把这个文件的内容创建为Swarm Secret,不需要提前手动创建。

方式2:直接写base64编码的密码内容(不推荐,因为明文编码后仍有泄露风险)

如果不想用文件,需要把密码转换成base64编码(比如echo -n "你的密码" | base64),然后写在data字段:

version: '3.1'
services:
  my_app:
    image: your-app-image:latest
    secrets:
      - db_password
    # 其他服务配置...

secrets:
  db_password:
    data: "YmlsbF9lbmNyeXB0ZWRfcGFzc3dvcmQ="  # 替换成你的密码的base64编码值

最后验证部署

按上述修正后,执行正确的docker stack deploy命令,就能正常加载Secrets到你的服务里了。服务内部可以通过/run/secrets/[secret名称]路径访问到Secret的内容(比如/run/secrets/db_password)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:06:51