如何在docker-compose中不存文件直接使用Docker Secrets?
解决Docker Compose使用已创建的Secrets问题
前提条件
Docker Secrets是Swarm模式专属功能,必须先启用Swarm(单节点也可使用):
docker swarm init
单节点执行上述命令即可;多节点集群需按Swarm初始化流程操作。
正确的Docker Compose配置
1. 定义外部Secrets
在docker-compose.yml的顶级节点添加secrets配置,明确指定已创建的Secrets为外部资源:
services: # 你的服务配置 app: image: your-app-image:latest # 方式1:将Secrets挂载为容器内文件 secrets: - api-key - db # 方式2:将Secrets内容转为环境变量(需配合启动命令读取文件) command: sh -c 'export API_KEY=$(cat /run/secrets/api-key) && export DB_SECRET=$(cat /run/secrets/db) && exec your-app-start-command' # 顶级Secrets配置 secrets: api-key: external: true # 声明该Secret已通过docker secret create创建,无需Compose生成 db: external: true
2. 两种使用Secrets的方式
- 挂载为文件:默认情况下,Secrets会被挂载到容器内的
/run/secrets/<secret-name>路径,应用可直接读取该文件获取密钥内容。 - 转为环境变量:通过启动命令读取Secret文件内容并赋值给环境变量,适合依赖环境变量的应用。
错误原因解析
- "secrets.api-key must be a mapping":Secrets配置格式错误,比如写成了数组形式
secrets: [api-key],正确格式应为每个Secret是包含external: true的映射对象。 - "unsupported external secret":未启用Docker Swarm模式,普通Docker Compose(非Swarm环境)不支持外部Secrets功能。
- 容器内环境变量为空:使用
file指定文件时,仅指定了路径但未读取文件内容,或未正确挂载Secret文件到容器内。
内容的提问来源于stack exchange,提问作者delete
相关产品推荐
相关产品推荐

