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

Docker Compose集成私有Maven仓库时连接被拒及部署顺序问题

Docker Compose整合SpringBoot与Nexus3的问题解决

问题1:users-ws容器先于Nexus3就绪启动

原因

depends_on 仅能保证Nexus3容器先启动,但无法确保Nexus服务完全就绪(Nexus启动时需要加载大量数据,通常需要1-2分钟),导致users-ws构建时Nexus还没提供服务。

解决方案

使用Docker Compose的healthcheck配置Nexus的健康检查,让users-ws等待Nexus服务就绪后再启动:

version: '3.8'
services:
  nexus3:
    image: sonatype/nexus3
    ports:
      - "8081:8081"
    healthcheck:
      # 用Nexus官方健康检查接口判断服务是否就绪
      test: ["CMD", "curl", "-f", "http://localhost:8081/service/rest/v1/status"]
      interval: 30s       # 每30秒检查一次
      timeout: 10s        # 超时时间10秒
      retries: 10         # 最多重试10次
      start_period: 60s   # 启动后60秒再开始检查(给Nexus足够初始化时间)

  users-ws:
    build: .
    depends_on:
      nexus3:
        condition: service_healthy  # 仅当Nexus健康检查通过后才启动

问题2:无法连接localhost:8081获取自定义依赖

原因

在Docker容器内部,localhost指向容器自身的网络栈,而非宿主机。你本地构建时用了--network host复用宿主机网络,所以能访问localhost:8081,但Docker Compose默认使用自定义桥接网络,每个容器有独立网络环境,localhost无法指向宿主机的Nexus服务。

解决方案

  1. 修改Maven仓库地址:将settings.xml或pom.xml中的Nexus地址从http://localhost:8081改为http://nexus3:8081(nexus3是你在Docker Compose中定义的服务名称,Docker会自动解析这个名称到Nexus容器的IP)。
    示例settings.xml片段:

    <mirror>
      <id>maven-public</id>
      <mirrorOf>*</mirrorOf>
      <url>http://nexus3:8081/repository/maven-public/</url>
    </mirror>
    
  2. 确保构建阶段网络互通:如果Dockerfile在构建过程中执行Maven打包拉取依赖,需要保证构建阶段能访问Nexus服务。在Docker Compose的build配置中指定使用compose默认网络:

    users-ws:
      build:
        context: .
        network: service_default  # 使用compose默认网络,确保构建容器能解析nexus3服务名
      depends_on:
        nexus3:
          condition: service_healthy
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:52:44