事情本身不复杂,线索都在日志里。docker-compose.yml 里把 OPENAI_API_KEY 写在 environment 下,镜像推到私有仓库后,任何能登机器的人执行 docker inspect 就能看到明文,安全扫描直接报高危。

第一反应是「compose 文件提交进了 Git 历史」,验证下来不成立。

排查方向其实有限,先把可能性排一排。environment 的值会写进容器配置,inspect 可见。还有一种是.env 文件被一起打进镜像。

还有一种情况,用 build args 传密钥,镜像层里也留下了。

上来先确认 inspect 里能不能看到明文

docker inspect app | grep -i -A2 OPENAI_API_KEY

随后改用 secret 文件挂载到容器

python -c "print('secrets:\n  openai_key:\n    file: ./secrets/openai_key')"

轮换已经泄露的 key 并更新部署

python -c "print('rotate key in provider console')"

扫描镜像层和历史记录确认没有残留

docker history --no-trunc app:latest | grep -i key

这类问题以前遇到过,但这次的触发条件和上次不一样。

改完先别撤,确认这几项。docker inspect 里只剩 secret 的挂载路径,看不到明文,镜像历史里没有 key,轮换后的新 key 调用正常。

补一句。environment 和 build args 都会写进镜像或容器元数据,不是秘密存储;密钥要用 secret 挂载或外部密钥管理,泄露后先轮换再清理。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189