构建期机密挂载
RUN --mount=type=secret 在单条 RUN 执行期间把机密文件挂到指定路径,用完即撤,不写进镜像层,也不进构建历史。它和用 ARG 传递凭据解决的是同一个需求,区别在于不会留下任何痕迹,前提是使用 BuildKit 构建。
基本信息
| 作用 | 构建期临时使用机密文件:凭据、token、证书 |
|---|---|
| 语法 | RUN --mount=type=secret,id=npmrc,target=/root/.npmrc 命令 |
| 提供方式 | docker build --secret id=npmrc,src=.npmrc . |
| 默认挂载点 | 不写 target 时挂在 /run/secrets/<id> |
| 依赖 | BuildKit 构建器 |
典型使用场景
- 私有包源认证:npm、pip、apk 需要凭据文件时临时挂载
- 拉取私有仓库依赖:构建期临时提供访问 token
- 构建期签名:需要签名密钥的打包步骤
- 从内网制品库下载构件,凭据不落进镜像
- CI 环境注入凭据的统一做法:文件由流水线提供,构建命令显式引用
- 安全自查:确认最终镜像的层与构建历史里没有凭据痕迹
示例
示例
RUN --mount=type=secret,id=npmrc,target=/root/.npmrc \
npm ci --omit=dev
# 默认挂载到 /run/secrets/<id>,也可以自己读取
RUN --mount=type=secret,id=netrc \
sh -c 'install -m 600 /run/secrets/netrc /root/.netrc && make deps'
# 命令行提供机密内容(读取宿主文件)
docker build --secret id=npmrc,src=$HOME/.npmrc -t app/web:1.0 .机密传递方式对照
| 方式 | 镜像里是否留痕 | 结论 |
|---|---|---|
| ARG 或 ENV | 会,构建历史与镜像配置可见 | 不要用于真实凭据 |
| COPY 文件 | 会,层内可提取 | 即使随后删除仍留有副本 |
| --mount=type=secret | 不会,仅挂载期间存在 | BuildKit 下的推荐做法 |
| 构建后扫描镜像 | 用于验证 | 可用镜像层扫描工具复核 |
secret 只能被它所在的那条 RUN 使用,多条命令需要同一份凭据时分别挂载,不要指望跨步骤复用挂载点。
这套写法需要 BuildKit(新版 Docker 默认启用),旧环境要显式开启,或在构建命令前加环境变量强制启用。
secret 内容不参与层缓存的键计算,更换凭据后可能仍命中旧缓存,涉及私有源的层必要时强制重建一次。
机密文件只在挂载期间存在于容器文件系统里,构建结束后该路径为空;后续步骤要读同一路径时必须重新挂载,不要依赖上一步留下的文件。