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):
- 先提前创建Secret:
比如把密码存入一个本地文件db_password.txt,然后创建Secret:$ echo "你的加密密码内容" > ./db_password.txt $ docker secret create db_password ./db_password.txt - 编写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

