环境变量是进程配置机制,不是秘密保险箱。Docker 只是把键值传给容器主进程。
| 方式 | 生效阶段 | 典型用途 |
|---|---|---|
Dockerfile ARG | 构建时 | 构建选项 |
Dockerfile ENV | 构建后与运行时 | 镜像默认配置 |
Compose environment | 运行时 | 明确的环境配置 |
Compose env_file | 运行时 | 批量加载本地配置 |
services:
api:
image: example/api:1.0
environment:
APP_ENV: production
env_file:
- runtime.envCompose 项目中的 .env 还可以用于 YAML 变量插值,但变量被插值不代表会自动进入容器;是否注入仍由 environment 或 env_file 决定。
凭据不要经过镜像层
不要把密码、令牌写入 ARG、ENV、Dockerfile 或构建命令。它们可能出现在镜像配置、构建历史、日志或缓存里。
构建过程中确实需要凭据时,应使用 BuildKit secret mount 或 SSH mount,让凭据只在需要它的构建指令中临时可见。开发环境可以使用不提交 Git 的本地配置文件;生产环境应使用部署平台的 Secret 管理能力,并控制读取权限。前端构建变量最终会进入浏览器下载的静态文件,永远不能承载秘密。
提交前可以检查最终配置,但不要把包含敏感值的输出保存到日志:
docker compose config参考:Compose environment variables、Build variables、Build secrets