安全扫描报镜像里含明文口令,docker history api:2.1 能看到一层命令写着 ENV DB_PASSWORD=Prod@2026。这个镜像已经在仓库里推了三个 tag。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

docker history --no-trunc api:2.1 | head -20
docker run --rm api:2.1 env | grep -i pass
docker buildx build --secret id=dbpass,src=./dbpass.txt .

ENV 和 ARG 都会写进镜像元数据,history 里能看到完整命令和值,删掉文件也只影响工作层。镜像一旦推送到仓库,任何有拉取权限的人都能翻出来。这一点先确认清楚,后面就不用反复试。

「镜像泄露密钥」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

具体做法是,把口令从 Dockerfile 里删掉 改用构建时 secret 或者运行时注入;运行时走 Secret 挂载 不要用 ENV 落盘;已经推上去的镜像要重新构建并换 tag 旧层还在仓库里;用 docker history 扫一遍历史层 确认没有别的敏感值。

改完照着核一遍,history 里看不到口令,容器运行时的环境变量里也没有这个值。

作者 9823189