如何正确使用docker build --secret为构建阶段应用传递密钥?
问题根因
- 每个
RUN指令都是独立的Shell会话,上一个RUN中export的环境变量仅作用于当前会话,不会传递到后续RUN指令 --mount=type=secret的挂载生命周期仅限所属的RUN指令,指令执行完成后密钥文件会自动卸载,后续步骤无法访问/run/secrets/下的对应文件
解决方案
将密钥读取、环境变量导出、测试执行三个步骤合并到同一个带有secret挂载的RUN指令中即可,修改后的test阶段配置如下:
FROM development AS test RUN --mount=type=secret,id=mysecret \ # 同时导出大小写两个环境变量匹配应用读取逻辑 export MYSECRET=$(cat /run/secrets/mysecret) && \ export mysecret="$MYSECRET" && \ coverage run --omit='src/manage.py,src/config/*,*/.venv/*,*/*__init__.py,*/tests.py,*/admin.py' src/manage.py test src && coverage report
补充说明
- 该配置不会导致密钥泄漏:BuildKit的secret机制不会将密钥内容写入镜像层,构建完成后不会残留密钥信息
- 如果后续有多个构建步骤需要用到该密钥,每个步骤的
RUN指令都需要单独添加--mount=type=secret,id=mysecret参数,或把所有需要密钥的步骤合并到同一个RUN指令中
内容的提问来源于stack exchange,提问作者strumpy_strudel
相关产品推荐
相关产品推荐

