事情本身不复杂,线索都在日志里。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 挂载或外部密钥管理,泄露后先轮换再清理。这类问题最好一次改到位,反复小改反而容易把原因搅混。
