Docker环境下SonarScanner无法连接SonarQube服务求助
Docker下SonarScanner无法连接SonarQube的问题修复
问题根源
- 容器内
localhost指向错误:在Docker Compose的同一网络中,每个容器的localhost仅指代容器自身。你配置的SonarScanner容器里访问http://localhost:9000,实际是在尝试连接自己的9000端口,而非SonarQube容器的服务。同一Docker网络下,容器间可直接通过服务名访问,也就是你配置里的sonarqube。 - 服务启动顺序问题:
depends_on仅保证容器的启动顺序,不会等待SonarQube服务完全就绪。SonarQube启动需要加载数据库、完成初始化,耗时比Scanner长,导致Scanner启动时SonarQube还没准备好接收请求。
修改后的docker-compose.yml配置
重点修正SonarScanner的SONAR_HOST_URL,同时添加健康检查确保SonarQube就绪后再启动Scanner(可选,但更稳妥):
version: '3' services: sonarqube: image: sonarqube:latest ports: - "9000:9000" networks: - sonarnet environment: - SONARQUBE_JDBC_URL=jdbc:postgresql://db:5432/sonar - SONARQUBE_JDBC_USERNAME=sonar - SONARQUBE_JDBC_PASSWORD=sonar volumes: - sonarqube_data:/opt/sonarqube/data - sonarqube_logs:/opt/sonarqube/logs - sonarqube_extensions:/opt/sonarqube/extensions depends_on: - db healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:9000/api/system/status || exit 1"] interval: 30s timeout: 10s retries: 5 db: image: postgres:latest environment: - POSTGRES_USER=sonar - POSTGRES_PASSWORD=sonar - POSTGRES_DB=sonar volumes: - postgresql:/var/lib/postgresql networks: - sonarnet healthcheck: test: ["CMD-SHELL", "pg_isready -U sonar"] interval: 30s timeout: 10s retries: 5 sonarscanner: image: sonarsource/sonar-scanner-cli volumes: - ./payment-and-transaction:/usr/src environment: - SONAR_PROJECT_KEY=payment-and-transaction - SONAR_HOST_URL=http://sonarqube:9000 # 替换为服务名 - SONAR_LOGIN=xxxxxxxxxxxxxxxxxx # 去掉引号,避免解析异常 networks: - sonarnet depends_on: sonarqube: condition: service_healthy # 等待SonarQube健康检查通过再启动 volumes: sonarqube_data: sonarqube_logs: sonarqube_extensions: postgresql: networks: sonarnet:
额外操作建议
- 若不想配置健康检查,可手动分步启动服务:
- 先启动SonarQube和数据库:
docker-compose up -d sonarqube db - 等待5-10分钟(根据机器性能调整),确认浏览器访问
http://localhost:9000能正常打开SonarQube页面后,再启动Scanner:docker-compose up sonarscanner
- 先启动SonarQube和数据库:
错误日志解析
你看到的Connection refused (Connection refused),是因为SonarScanner容器尝试连接自身的127.0.0.1:9000,但该端口并未监听SonarQube服务,导致连接被拒绝。将地址改为服务名后,Docker内置DNS会自动解析到SonarQube容器的IP,即可正常通信。
内容的提问来源于stack exchange,提问作者Usman Iqbal
相关产品推荐
相关产品推荐

