docker-compose中PostgreSQL服务名非db时SonarQube连接报错
核心结论
服务名db在Docker Compose中没有任何特殊内置含义,连接失败的本质是你配置的数据库连接地址主机名与实际服务名不匹配。
原理说明
Docker Compose会为加入同一自定义网络的所有服务自动提供内部DNS解析能力:
- 服务之间做内部访问时,直接使用
services块下定义的服务名作为访问主机名即可完成解析 - 你当前SonarQube配置的JDBC连接串为
jdbc:postgresql://db:5432/sonar,其中db就是用于DNS寻址的主机名,它仅能匹配名为db的数据库服务 - 当你把数据库服务名修改为其他值时,连接串里的主机名找不到对应解析记录,SonarQube自然无法连接数据库,就会抛出你看到的Bean初始化失败、数据库连接错误。
自定义数据库服务名的方法
如果你需要将数据库服务名修改为postgresql、sonar-db等自定义名称,只需要同步修改SonarQube服务的JDBC连接串配置即可。例如将数据库服务命名为postgresql时,对应配置调整为:
services: sonarqube: image: sonarqube expose: - 9000 ports: - "127.0.0.1:9000:9000" networks: - sonarnet environment: # 这里的主机名同步改成和数据库服务名一致 - sonar.jdbc.url=jdbc:postgresql://postgresql: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 # 自定义的数据库服务名 postgresql: image: postgres networks: - sonarnet ports: - "5432:5432" environment: - POSTGRES_USER=sonar - POSTGRES_PASSWORD=sonar volumes: - postgresql:/var/lib/postgresql - postgresql_data:/var/lib/postgresql/data
调整完成后重新执行docker-compose up -d即可正常启动。
Docker Compose服务命名规则
服务命名没有强制的业务含义约定,仅需要满足以下语法要求:
- 仅可使用小写字母、数字、横杠
-、下划线_、点.,禁止使用大写字母、其他特殊字符 - 同一个docker-compose.yml文件内的服务名必须唯一
- 没有任何规则要求数据库服务必须命名为
db,所有服务名均可根据需求自定义,只要保证服务间互访时使用的主机名与实际服务名匹配即可。
额外注意:你贴出的原始配置存在YAML缩进错误,
sonarqube和db两个服务名需要在services节点下缩进一级,否则Docker Compose会识别不到服务定义、报配置格式错误。
内容的提问来源于stack exchange,提问作者mogale
相关产品推荐
相关产品推荐

