You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过环境变量实现docker-compose条件启动smtp4dev服务?

基于环境变量条件启动Docker Compose服务的解决方案

以下是几种适配你场景的可行方案,按官方推荐度排序:

方案1:使用Docker Compose Profiles(官方推荐)

Docker Compose 1.28+支持Profiles功能,可通过环境变量选择性启动指定服务,逻辑清晰且易维护。

步骤:

  1. 修改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
  1. 在.env文件中配置控制变量:
ENV=dev
# 根据ENV值设置启用的profile
COMPOSE_PROFILES=${ENV:-}
# 根据ENV值决定server是否依赖smtp4dev
SMTP_DEPEND=${ENV:+smtp4dev}

当ENV不为dev时,COMPOSE_PROFILES和SMTP_DEPEND会自动为空,此时smtp4dev不会启动,server也仅依赖postgres。

  1. 启动命令:
    直接运行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文件

将公共服务与环境专属服务拆分到不同文件,通过启动命令选择性加载。

  1. 创建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
  1. 创建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
  1. 编写启动脚本(以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 13:10:11