Docker中配置管理需区分构建时、运行时和编排时:构建时用ENV设默认值,运行时用-e或--env-file注入环境变量,挂载文件用-v映射配置,Compose中通过environment、env_file和volumes统一管理。

在 Docker 中配置环境变量和挂载文件,核心是区分“构建时”“运行时”和“编排时”三种场景。方式不同,适用阶段和灵活性也不同——环境变量适合轻量、可变的配置;挂载文件更适合结构化、敏感或频繁更新的配置内容。
运行时用 -e 和 --env-file 设置环境变量
启动容器时最常用、最灵活的方式:
-
-e KEY=VALUE:单个变量,适合临时调试或覆盖默认值,例如:
docker run -e APP_ENV=staging -e LOG_LEVEL=warn nginx -
--env-file 文件路径:从本地 .env 文件批量加载,格式为
KEY=VALUE(等号两侧不能有空格),注释用#开头;适合管理多个变量,比如数据库连接参数 - 注意:命令行传入的
-e优先级最高,会覆盖 Dockerfile 中的 ENV 或 env_file 中同名变量
构建时用 ENV 指令设默认值
写在 Dockerfile 里,作为镜像固有属性,适用于不常变动的通用配置:
- 语法简单:
ENV NODE_ENV=production或多行写法:ENV TZ=Asia/Shanghai \ PYTHONUNBUFFERED=1 - 这些变量在构建阶段(RUN)和运行阶段(CMD/ENTRYPOINT)都可用
- 缺点是无法在不重建镜像的情况下修改,不适合密码、域名等环境相关值
用 -v 挂载配置文件到容器内
把宿主机上的 YAML、JSON、INI 等配置文件映射进容器,让应用直接读取:
- 典型命令:
docker run -v $(pwd)/config.yaml:/app/config.yaml my-app,其中左侧是宿主机路径,右侧是容器内路径 - MySQL 官方镜像会自动加载
/etc/mysql/conf.d/下所有.cnf文件;Nginx 默认读/etc/nginx/nginx.conf—— 挂载前先确认目标路径和权限 - 挂载后文件内容实时生效(部分服务需 reload),比环境变量更易表达嵌套结构,也更安全(避免敏感信息暴露在进程环境里)
Docker Compose 中统一管理两者
适合多服务协作项目,兼顾清晰性和可维护性:
-
environment: 在 service 下直接写键值对,支持映射语法(推荐)或列表语法;也可引用宿主机变量,如
- DB_HOST(不赋值即透传) -
env_file: 指定一个或多个 .env 文件,例如
env_file: [".env.common", ".env.prod"],后加载的同名变量会覆盖前面的 -
volumes: 挂载配置文件,例如
- ./redis.conf:/usr/local/etc/redis/redis.conf:ro,:ro表示只读,防止容器误改 - 建议:.env 文件存非敏感基础配置(如端口、日志级别),敏感信息用 secret 或外部密钥管理工具替代


















