关键不是“删掉”,而是“根本别让它进去”。docker镜像每层不可变,硬编码密码会永久留存于元数据;必须禁用env/arg/run明文传密,改用buildkit --secret临时注入、多阶段构建精确复制产物,并配合.dockerignore排除敏感文件。

关键不是“删掉”,而是“根本别让它进去”。Docker 镜像每一层不可变,一旦写入,即使后续 RUN rm 也抹不掉历史记录。防护必须前置到构建逻辑本身。
禁用硬编码方式传递敏感信息
ENV、ARG、RUN 中直接写密码或密钥,会永久存入镜像元数据,docker inspect 或 docker history 可直接查看。
- 禁止
ENV DB_PASSWORD=xxx或RUN export TOKEN=yyy - 避免
RUN curl -u user:pass http://...这类含凭证的命令 -
ARG仅用于非敏感参数(如版本号、开关标志),不可用于密钥
用 BuildKit --secret 安全注入构建时凭据
当构建需访问私有仓库、下载认证资源时,应使用 Docker BuildKit 的 secret 机制——它只在构建容器内存中临时存在,进程退出即销毁,不落盘、不写入任何镜像层。
- 启用 BuildKit:
export DOCKER_BUILDKIT=1 - 挂载 secret:
docker build --secret id=mykey,src=./id_rsa . - Dockerfile 中通过
--mount=type=secret使用,例如:RUN --mount=type=secret,id=mykey ssh-keyscan ...
多阶段构建 + 精确复制
将构建与运行分离,中间阶段可携带密钥完成操作,最终镜像只复制必要产物,彻底剥离源码、密钥、工具链等敏感内容。
- 构建阶段命名明确:
FROM golang:1.21 AS builder - 运行阶段基于最小基础镜像:
FROM alpine:latest - 仅复制二进制或配置文件:
COPY --from=builder /app/myapp .,不使用通配符(如COPY --from=builder . .) - 配合
.dockerignore排除.env、secrets/、.git、*.pem等敏感路径
CI/CD 流程中加强卡控
构建前、构建后都需设防,形成闭环。
- 提交前本地扫描:
git-secrets或truffleHog检测代码中密钥模式 - 构建后镜像扫描:
trivy secret scan myimage:latest或docker scout secret scan - 密钥统一由 Vault/KMS 管理,CI 环境变量注入,不落地、不硬编码











