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

Docker Compose指定不同Dockerfile均启动prod环境问题

问题原因

两个服务配置了完全相同的image: spring-boot镜像标签,是该异常的核心诱因。
Docker Compose 构建镜像时会以配置的image字段作为镜像的唯一标签标识:如果多个服务声明了相同的镜像标签,构建流程只会执行一次镜像构建,后续同标签的服务会直接复用本地已存在的镜像,不会再读取自身配置的Dockerfile重新构建。
如果本地之前留存过生产环境构建出的spring-boot:latest镜像,启动test服务时会直接复用该生产镜像,完全不会触发测试环境Dockerfile的构建逻辑;即便是无缓存全新构建,两个同标签服务的构建结果也会互相覆盖,最终两个容器运行的是同一个镜像。

修复方法

为两个服务配置互不重复的镜像标签即可,对应配置修改片段如下:

test:
    container_name: java-test
    image: spring-boot:test # 测试环境镜像单独设置标签
    build:
      context: .
      dockerfile: docker/test/Dockerfile
    # 其余原有配置保持不变
    ports:
      - "8081:8081"
      - "5005:5005"
    depends_on:
      db:
        condition: service_healthy
    volumes:
       - ${APPLICATION_ROOT_FOLDER}:/usr/src/mymaven
       - ${MAVEN_SETTINGS_FOLDER}:/root/.m2

  java:
    container_name: java
    image: spring-boot:prod # 生产环境镜像单独设置标签
    build:
      context: .
      dockerfile: docker/prod/Dockerfile
    # 其余原有配置保持不变
    ports:
      - "8082:8082"
      - "5006:5006"
    depends_on:
      db:
        condition: service_healthy
    volumes:
       - ${APPLICATION_ROOT_FOLDER}:/usr/src/mymaven
       - ${MAVEN_SETTINGS_FOLDER}:/root/.m2
操作验证

修改完成后按以下步骤操作:

  • 执行命令清理旧容器、无用镜像和缓存:docker-compose down -v && docker rmi spring-boot:latest
  • 执行无缓存构建启动命令:docker-compose up --build

构建过程中可以看到两个服务分别读取docker/test/Dockerfile和docker/prod/Dockerfile完成独立构建,启动后就会按照各自镜像的预设逻辑运行。

额外注意:你的配置中两个服务都把本地项目目录挂载到了容器内的Maven工作路径,如果Dockerfile中定义的启动逻辑是读取挂载目录下的代码执行,还需要确认两个容器的启动命令、环境变量配置符合测试/生产的各自要求,避免挂载覆盖镜像内的预设配置导致逻辑异常。

内容的提问来源于stack exchange,提问作者Mathys

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:51:21