Docker Compose中如何将Docker Secrets传递至环境变量?
Docker Secrets 环境变量传递问题解答
问题1:环境变量显示路径而非密码内容的原因及解决方法
Docker Secrets的核心机制是将密钥内容以文件形式挂载到容器内的/run/secrets/目录下,你直接把文件路径赋值给FOO_PASS环境变量,自然变量值就是这个路径字符串,而非文件里的密码内容。
要实现将密钥内容赋值给环境变量,需要在容器启动时主动读取该文件的内容,再赋值给变量,常见两种实现方式:
方式一:通过自定义启动脚本处理
编写一个entrypoint.sh启动脚本:# 读取密钥文件内容并赋值给环境变量 export FOO_PASS=$(cat /run/secrets/foo_pass) # 执行容器原本的启动命令 exec "$@"然后在Dockerfile中配置该脚本为入口:
COPY entrypoint.sh / RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] CMD ["your-original-start-command"]方式二:在Compose文件中直接通过command字段执行读取逻辑
如果服务启动命令支持shell执行,可直接修改command字段:services: foo: # 其他配置保持不变 command: sh -c 'export FOO_PASS=$(cat /run/secrets/foo_pass) && your-original-start-command'
问题2:单个密钥文件能否传递多个变量值
可以实现,但Docker本身不会自动解析多变量格式,需要你自定义密钥文件格式并在容器启动时手动解析:
将密钥文件写成键值对格式(比如
foo_pass.txt内容):DB_USER=admin DB_PASS=abc123 REDIS_PASS=xyz789在启动脚本中添加解析逻辑,将文件中的键值对逐个导出为环境变量:
# 逐行读取密钥文件,导出为环境变量 while IFS='=' read -r key value; do export "$key"="$value" done < /run/secrets/foo_pass exec "$@"
内容的提问来源于stack exchange,提问作者laggerok19
相关产品推荐
相关产品推荐

