核心思路是将配置从镜像中抽离,使镜像仅承载运行逻辑,环境参数由外部注入:用ARG在构建阶段传入非敏感构建参数(如BUILD_ENV=dev),通过ENV转为运行时变量;用-e或--env-file在运行时注入敏感配置(如DB_URL、API_KEY);结合Docker Compose Profiles按需启用服务组;再通过语义化镜像标签(如v1.2.0-prod)实现版本与环境解耦。

核心思路是把配置从镜像里“抽出来”,让镜像只负责运行逻辑,环境参数由外部注入。这样一份镜像就能在开发、测试、生产环境复用,切换环境只需改参数,不用重构建。
用 ARG 在构建阶段区分环境
ARG 适合传入构建时就确定的值,比如编译目标环境、启用的特性开关,它不会留在最终镜像中,安全性高。
- 在 Dockerfile 中定义: ARG BUILD_ENV=dev,再用 ENV ENVIRONMENT=$BUILD_ENV 把它转成运行时变量
- 构建时指定:docker build --build-arg BUILD_ENV=prod -t myapp:prod .
- 常见用途:控制是否安装调试工具、选择基础镜像版本、注入 Git 分支名或构建时间
用 ENV + -e 在运行时注入敏感配置
数据库地址、密码、密钥等必须在容器启动时才传入,避免硬编码或泄露到镜像层。
- 启动命令示例:docker run -d -e DB_URL=postgresql://prod-db:5432/app -e API_KEY=xxx myapp:prod
- 配合 .env 文件更清晰:docker run --env-file .env.prod -d myapp:prod,.env.prod 里写 DB_URL=... 和 LOG_LEVEL=warn
- 注意:-e 设置的变量会覆盖 Dockerfile 中 ENV 的默认值,优先级更高
用 Docker Compose Profiles 按需启用服务组
不同环境依赖的服务不同,Profiles 能让你用一个 compose.yaml 文件管理全部场景,启动时指定 profile 即可激活对应模块。
- 在 docker-compose.yml 中为服务加 profiles 字段:profiles: ["dev"] 表示该服务只在 dev 环境加载
- 开发时运行:docker compose --profile dev up -d,自动启动 web + db + debug-tools
- 生产时运行:docker compose --profile prod up -d,只启动 web + db,跳过日志分析器、mock 服务等非核心组件
- 支持多 profile 组合,例如 --profile staging --profile monitoring
结合镜像标签实现版本与环境解耦
镜像标签不只写 latest,应体现构建意图,比如 myapp:v1.2.0-prod 或 myapp:20260501-staging,再配合环境变量完成最终适配。
- CI/CD 流水线中,根据分支自动打标:main → -prod,develop → -dev
- 回滚时只需改 docker-compose.yml 中的 image 字段,或改 docker run 命令的镜像名,无需重新构建
- 搭配 registry 镜像仓库的清理策略(如保留最近 5 个 prod 标签),避免磁盘爆满











