环境变量是容器启动时注入的运行时配置,非镜像固有属性;可通过dockerfile中env预设默认值、docker run -e或--env-file覆盖、docker-compose.yml集中管理、arg+env实现构建时动态传参等方式灵活安全配置。
环境变量不是镜像自带的属性,而是容器启动时才注入的运行时配置。它不改变镜像本身,但直接决定容器内程序的行为。配置方式要分清构建阶段和运行阶段,选对方法才能既安全又灵活。
在 Dockerfile 中预设默认值(构建时)
适合非敏感、通用配置,比如 APP_PORT=3000、NODE_ENV=production。这些值会固化进镜像,方便复用:
- 用 ENV 指令定义:例如 ENV LOG_LEVEL=info
- 避免写密码、密钥等敏感信息——docker inspect 或 docker history 都能轻易看到
- 如需构建时动态传参(如版本号),可用 ARG + ENV 组合:ARG BUILD_VERSION; ENV APP_VERSION=${BUILD_VERSION}
启动容器时覆盖或新增(运行时)
这是最常用也最推荐的方式,无需重建镜像就能切换配置,尤其适合敏感信息:
- 单个变量:docker run -e DB_HOST=192.168.1.100 my-app
- 多个变量:docker run -e DB_USER=admin -e DB_PASSWORD=123456 my-app
- 更安全的做法是用 --env-file 加载外部文件:docker run --env-file .env my-app
- .env 文件格式为纯文本,每行一个 KEY=VALUE,记得加进 .gitignore
用 docker-compose.yml 集中管理多服务
适合有多个容器协作的场景,配置清晰、易维护:
- 直接写死(适合测试):environment: - DEBUG=true - API_TIMEOUT=5000
- 映射语法(更清晰):environment: { DEBUG: "true", LOG_LEVEL: "warn" }
- 引用宿主机变量:- DB_PASSWORD=${DB_PASSWORD}(需确保宿主机已设置)
- 加载外部文件:env_file: [".env.prod"],支持多文件叠加,后加载的同名变量会覆盖前面的
构建阶段传参(仅 build-time 有效)
用于控制构建过程本身,比如指定版本、开关或代理地址,但不会留在最终镜像里:
- 在 Dockerfile 中声明:ARG HTTP_PROXY; ENV http_proxy=${HTTP_PROXY}
- 构建时传入:docker build --build-arg HTTP_PROXY=http://proxy.example.com .
- 不要用 ARG 直接拼接密钥或敏感操作命令,缓存层可能残留痕迹
- 真正需要运行时才读取的密钥,一律走 --env、--env-file 或 /run/secrets











