环境变量不是镜像固有属性,而是在容器启动时注入的运行时配置;可通过dockerfile预设默认值、docker run命令覆盖、--env-file加载文件、docker-compose.yml集中管理等方式灵活配置。
镜像(image)是只读的静态模板,包含运行应用所需的所有文件、依赖和配置;容器(container)是镜像的一个可运行实例,具有独立的文件系统、网络和进程空间。环境变量不是镜像固有属性,而是在容器启动时注入的运行时配置——它不改变镜像本身,但直接影响容器内程序的行为。
在 Dockerfile 中预设默认环境变量
适用于非敏感、通用配置(如 NODE_ENV=production、APP_PORT=3000),这些值会固化进镜像层,便于复用:
- 使用 ENV 指令定义,例如:
ENV LOG_LEVEL=info - 避免在此处写密码、密钥等敏感信息,因为
docker inspect或docker history可轻易查看 - 若需构建时动态传参(如版本号),可用 ARG + ENV 组合:
ARG BUILD_VERSION; ENV APP_VERSION=${BUILD_VERSION}
通过 docker run 命令覆盖或添加变量
这是最常用、最灵活的方式,无需重建镜像即可切换配置:
- 单个变量:
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"],支持多文件叠加,后加载的同名变量会覆盖前面的
运行中临时修改(仅限当前进程)
不建议用于生产配置,仅适用于调试或一次性操作:
- 进入容器后执行:
docker exec -it my-container sh -c "export TEMP_VAR=test && ./app.sh" - 注意:该变量只在当前 shell 进程及其子进程中有效,容器重启即失效











