如何通过环境变量实现docker-compose条件启动smtp4dev服务?
基于环境变量条件启动Docker Compose服务的解决方案
以下是几种适配你场景的可行方案,按官方推荐度排序:
方案1:使用Docker Compose Profiles(官方推荐)
Docker Compose 1.28+支持Profiles功能,可通过环境变量选择性启动指定服务,逻辑清晰且易维护。
步骤:
- 修改
docker-compose.yml,给smtp4dev添加profiles标记,并调整server的依赖逻辑:
version: "3.8" # 需至少3.8版本以支持完整Profiles功能 services: postgres: container_name: ecoo-postgres image: postgis/postgis environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: ecoo_db ports: - "5432:5432" smtp4dev: container_name: ecoo-smtp image: rnwood/smtp4dev:v3 ports: - "3010:80" - "2525:25" profiles: ["dev"] # 仅在dev profile启用时启动该服务 server: container_name: ecoo-server build: context: . dockerfile: Dockerfile volumes: - ./src:/app/src - ./test:/app/test - ./prisma:/app/prisma depends_on: - postgres - ${SMTP_DEPEND:-} # 根据环境变量动态添加依赖 network_mode: "host" restart: always
- 在
.env文件中配置控制变量:
ENV=dev # 根据ENV值设置启用的profile COMPOSE_PROFILES=${ENV:-} # 根据ENV值决定server是否依赖smtp4dev SMTP_DEPEND=${ENV:+smtp4dev}
当ENV不为dev时,COMPOSE_PROFILES和SMTP_DEPEND会自动为空,此时smtp4dev不会启动,server也仅依赖postgres。
- 启动命令:
直接运行docker-compose up -d即可,Compose会自动读取环境变量并执行对应逻辑。
方案2:使用条件配置语法(适用于Compose 3.8+)
利用Shell参数扩展语法,直接通过环境变量控制服务是否被定义。
修改docker-compose.yml:
version: "3.8" services: postgres: container_name: ecoo-postgres image: postgis/postgis environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: ecoo_db ports: - "5432:5432" # 仅当ENV=dev时,该服务才会被解析为smtp4dev;否则服务名为空,不会创建 ${SMTP_SERVICE:-}: container_name: ecoo-smtp image: rnwood/smtp4dev:v3 ports: - "3010:80" - "2525:25" server: container_name: ecoo-server build: context: . dockerfile: Dockerfile volumes: - ./src:/app/src - ./test:/app/test - ./prisma:/app/prisma depends_on: - postgres - ${SMTP_DEPEND:-} # 动态控制依赖项 network_mode: "host" restart: always
在.env文件中配置:
ENV=dev # ${VAR:+value} 表示VAR非空时返回value,否则返回空 SMTP_SERVICE=${ENV:+smtp4dev} SMTP_DEPEND=${ENV:+smtp4dev}
方案3:拆分Compose文件
将公共服务与环境专属服务拆分到不同文件,通过启动命令选择性加载。
- 创建
docker-compose.base.yml存放公共服务:
version: "3" services: postgres: container_name: ecoo-postgres image: postgis/postgis environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: ecoo_db ports: - "5432:5432" server: container_name: ecoo-server build: context: . dockerfile: Dockerfile volumes: - ./src:/app/src - ./test:/app/test - ./prisma:/app/prisma depends_on: - postgres network_mode: "host" restart: always
- 创建
docker-compose.dev.yml存放dev专属服务:
version: "3" services: smtp4dev: container_name: ecoo-smtp image: rnwood/smtp4dev:v3 ports: - "3010:80" - "2525:25" server: depends_on: - smtp4dev
- 编写启动脚本(以Shell为例):
if [ "$ENV" = "dev" ]; then docker-compose -f docker-compose.base.yml -f docker-compose.dev.yml up -d else docker-compose -f docker-compose.base.yml up -d fi
Windows环境可编写对应批处理脚本实现相同逻辑。
内容的提问来源于stack exchange,提问作者Timóteo Stifft
相关产品推荐
相关产品推荐

