为docker容器设置环境变量与启动参数的核心是运行时动态注入配置,避免硬编码;-e用于单变量调试,--env-file适合生产批量加载敏感信息,dockerfile中env仅设非敏感默认值,docker compose统一管理多容器参数。

为 Docker 容器设置环境变量与启动参数,核心是把运行时才确定的配置(比如数据库地址、日志级别、时区、API 密钥)从镜像中剥离,交由启动阶段动态注入。这样既能避免硬编码泄露风险,也无需每次改配置就重新构建镜像。
运行时用 -e 直接传单个变量
适合调试、临时覆盖或少量非敏感参数。命令简洁,优先级最高,会直接覆盖 Dockerfile 中同名 ENV 值。
- 语法:docker run -e KEY=VALUE 镜像名,支持多次使用 -e 添加多个变量
- 例如:docker run -e TZ=Asia/Shanghai -e NODE_ENV=development nginx,可解决容器内时间显示错乱问题
- 注意大小写:DB_HOST 和 db_host 是两个独立变量,多数应用只识别大写命名规范
用 --env-file 批量加载变量文件
生产环境推荐方式,尤其适合含密码、密钥等敏感信息的场景,安全又易管理。
- 先准备一个本地 .env 文件(记得加到 .gitignore),内容如:
# 生产配置
DB_HOST=pg-prod.internal
DB_PASSWORD=Qw!9x#mL2
API_TIMEOUT=5000 - 启动命令:docker run --env-file .env my-app
- 文件支持 # 注释和空行,但不支持变量展开(不能写 DB_PATH=$HOME/data)
- 路径必须是相对当前目录或绝对路径;Docker 不校验文件是否存在,写错会静默忽略
在 Dockerfile 中设默认值(仅限非敏感项)
用于提供基础配置兜底,比如端口、日志等级、默认环境模式。值会固化进镜像层,所有人 inspect 或 history 都能看见,所以绝不能放密码、Token 等敏感内容。
- Dockerfile 示例:
FROM node:18-alpine
ENV APP_PORT=3000
ENV LOG_LEVEL=warn
WORKDIR /app - 构建后,若运行时不指定 APP_PORT,容器就自动用 3000;一旦用 -e APP_PORT=8080 启动,就会被覆盖
通过 Docker Compose 统一管理多容器参数
适用于微服务或前后端分离部署,把环境变量和启动参数集中写在 docker-compose.yml 中,清晰且可复用。
- 两种写法:
environment:
- DB_HOST=redis
- REDIS_PASSWORD=abc123
或引用外部文件:
env_file:
- ./prod.env - 注意:env_file 加载的变量优先级低于 environment 字段内直写的变量,两者都低于 docker run -e











