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

docker-compose环境下sonarscanner无法连接SonarQube服务端

问题根因
  • depends_on默认配置仅控制容器启动顺序,不会等待容器内服务完全就绪。从日志时间线可明确:scanner发起连接时,SonarQube刚完成Elasticsearch初始化流程,Web服务尚未监听9000端口,直接返回连接拒绝。
  • SonarQube首次启动需要完成数据库表结构初始化、Elasticsearch索引预热、内置插件加载全流程,通常耗时30~120秒,无健康检查机制的情况下scanner必然会在服务可用前发起请求。
  • 你的sonar-project.properties缺失必填的服务地址、源码路径配置,虽然scanner默认尝试解析sonarqube主机名,但配置缺失容易在后续调整时出现地址不匹配问题。
  • 配置中冗余的build: .字段存在隐患:如果当前目录没有自定义Dockerfile,会直接导致容器构建失败;无自定义镜像需求时不需要同时声明image和build字段。
修复方案

1. 调整docker-compose.yml配置

给PostgreSQL、SonarQube增加健康检查,修改scanner启动逻辑,确保scanner仅在SonarQube完全可用时才执行操作,修改后的完整配置如下:

version: "3"

services:
    sonarqube:
        image: sonarqube:community
        expose:
          - 9000
        ports:
          - "127.0.0.1:9000:9000"
        networks:
          - sonarnet
        environment:
          - sonar.jdbc.url=jdbc:postgresql://postgres:5432/sonar
          - sonar.jdbc.username=sonar
          - sonar.jdbc.password=sonar
        volumes:
          - sonarqube_conf:/opt/sonarqube/conf
          - sonarqube_data:/opt/sonarqube/data
          - sonarqube_extensions:/opt/sonarqube/extensions
          - sonarqube_bundled-plugins:/opt/sonarqube/lib/bundled-plugins
        # 新增健康检查,探测Web服务是否就绪
        healthcheck:
          test: ["CMD-SHELL", "curl -f http://localhost:9000/api/system/status || exit 1"]
          interval: 10s
          timeout: 5s
          retries: 30

    postgres:
        image: postgres:14
        networks:
          - sonarnet
        ports:
          - "127.0.0.1:5432:5432"
        environment:
          - POSTGRES_USER=sonar
          - POSTGRES_PASSWORD=sonar
        volumes:
          - postgresql:/var/lib/postgresql
          - postgresql_data:/var/lib/postgresql/data
        # 新增数据库健康检查
        healthcheck:
          test: ["CMD-SHELL", "pg_isready -U sonar"]
          interval: 5s
          timeout: 5s
          retries: 10

    sonarscanner:
      image: newtmitch/sonar-scanner
      networks:
        - sonarnet
      depends_on:
        sonarqube:
          condition: service_healthy
        postgres:
          condition: service_healthy
      volumes:
        - ./:/usr/src
      # 覆写默认启动命令,避免容器启动后立即执行扫描
      command: ["tail", "-f", "/dev/null"]

networks:
  sonarnet:

volumes:
  sonarqube_conf:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_bundled-plugins:
  postgresql:
  postgresql_data:

2. 补全sonar-project.properties配置

在配置文件中增加服务地址、源码路径必填项,避免默认值带来的不可预期问题:

# SonarQube服务地址,容器网络内直接通过服务名访问
sonar.host.url=http://sonarqube:9000
# 项目唯一标识
sonar.projectKey=toh-token
# 配置源码路径,对应容器内挂载的目录
sonar.sources=/usr/src

# --- 可选配置 ---
#sonar.projectName=toh
#sonar.projectVersion=1.0
#sonar.sourceEncoding=UTF-8

3. 按正确流程启动服务并执行扫描

  • 启动基础依赖服务:docker-compose up -d postgres sonarqube
  • 观察SonarQube日志,直到出现SonarQube is operational日志,代表服务完全可用:docker-compose logs -f sonarqube
  • 首次访问http://127.0.0.1:9000,使用默认账号admin/admin登录,按引导创建项目、生成扫描令牌
  • 手动触发扫描,将命令中的占位符替换为你生成的实际令牌:
docker-compose run --rm sonarscanner sonar-scanner -Dsonar.token=你的项目扫描令牌
注意事项
  • 不要在scanner配置中使用127.0.0.1:9000作为SonarQube地址,容器内的回环地址指向scanner容器自身,无法访问到其他容器的服务,必须使用Docker内部网络的服务名sonarqube访问。
  • Linux环境部署需要提前调整系统参数vm.max_map_count=262144,否则Elasticsearch会启动失败,导致SonarQube永远无法就绪。
  • 如果不需要对外暴露PostgreSQL服务,保持配置中127.0.0.1:5432:5432的绑定即可,避免数据库端口暴露在公网带来安全风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 21:15:48