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
相关产品推荐
相关产品推荐

