首页/云/Docker 容器速查/RUN --mount=type=secret 构建期机密
镜像与构建107 条

RUN --mount=type=secret 构建期机密

在单条 RUN 期间临时挂载机密文件(npmrc、证书、token),用完即撤,不会写进镜像层或构建历史。

Docker 容器速查云更新于 2026-10-13

构建期机密挂载

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 内容不参与层缓存的键计算,更换凭据后可能仍命中旧缓存,涉及私有源的层必要时强制重建一次。
机密文件只在挂载期间存在于容器文件系统里,构建结束后该路径为空;后续步骤要读同一路径时必须重新挂载,不要依赖上一步留下的文件。

易错点

  • CI 忘记传 --secret,挂载点是空的,报错出现在包管理器里(认证失败),排查方向容易被误导
  • 把 secret 挂到随后会被 COPY 覆盖的路径上,凭据文件被替换,构建中途认证失败
  • 以为 secret 也能保护运行期凭据:它只覆盖构建阶段,运行期要用运行环境自己的机密机制
  • 本地构建用 secret 通过,流水线缺少构建器或未启用 BuildKit,两边构建方式不一致而失败
  • 挂载的机密文件里写的是相对路径凭据(如指向本地缓存目录),在容器内环境不同导致读取失败,凭据文件内容要按容器内路径书写

数据来源与参考

  • Docker 官方文档:Build secrets(docs.docker.com/build/building/secrets)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌