SonarQube Docker容器连接外部数据库时的插件问题
这个场景我之前帮朋友排查过,核心问题基本是嵌入式H2和外部PostgreSQL的插件元数据同步/加载逻辑不一致导致的,结合你给出的日志和版本信息,给你几个针对性的解决思路:
1. 先确认PostgreSQL库中是否有插件元数据
SonarQube的插件信息是存在数据库里的,H2作为默认嵌入式库,镜像启动时会自动初始化一套默认插件的元数据;但切换到全新的PostgreSQL库时,这个空库是没有这些插件记录的,自然在界面上看不到。
排查方法:登录PostgreSQL,查询
plugins表(SonarQube 7.0的表名就是plugins):SELECT * FROM plugins;如果结果为空,那就是元数据缺失的问题。
解决办法:
- 临时启动一个用H2的SonarQube容器,等它完全启动后,导出
plugins和关联表(比如plugin_favorites、plugin_rules)的数据 - 把导出的数据导入到你的PostgreSQL库中
- 重启连接PostgreSQL的SonarQube容器,插件应该就会显示了
- 临时启动一个用H2的SonarQube容器,等它完全启动后,导出
2. 检查Docker启动时的数据库配置是否生效
从你提供的日志片段看,启动日志里还提到了EmbeddedDatabase,这有可能是容器没正确读取到PostgreSQL的连接参数,还是默认用了H2?
- 排查方法:
- 确认启动容器时是否正确设置了PostgreSQL相关的环境变量:
docker run -d \ -e SONAR_JDBC_URL=jdbc:postgresql://your-postgres-host:5432/sonarqube \ -e SONAR_JDBC_USERNAME=sonaruser \ -e SONAR_JDBC_PASSWORD=sonarpass \ sonarqube:7.0 - 进入容器查看
conf/sonar.properties文件,确认jdbc相关配置是否被正确覆盖
- 确认启动容器时是否正确设置了PostgreSQL相关的环境变量:
3. 验证PostgreSQL数据库权限
如果数据库用户权限不足,SonarQube无法写入或读取插件元数据,也会导致插件不显示。
- 解决办法:
- 确保PostgreSQL中给SonarQube用户分配了足够的权限:
GRANT ALL PRIVILEGES ON DATABASE sonarqube TO sonaruser; - 重启容器后,查看Web端的
web.log日志,看是否有数据库权限相关的报错
- 确保PostgreSQL中给SonarQube用户分配了足够的权限:
日志补充分析
你提供的日志片段:
2018.04.04 13:53:17 INFO web[][o.s.s.p.LogServerVersion] SonarQube Server / 7.0.0.36138 / 3b827a9a9a4b133c9fbe168aec8db44d78efeaeb
2018.04.04 13:53:17 INFO web[][o.s.s.p.d.EmbeddedDatabase] Starting embedded database on port 9092 with url jdbc:h2:tcp://127.0.0.1...
这段日志显示容器启动时还是在初始化嵌入式H2数据库,这说明你的PostgreSQL连接配置可能没生效,优先检查容器的环境变量设置是否正确,确保SonarQube确实连接到了外部PostgreSQL而不是默认的H2。
内容的提问来源于stack exchange,提问作者cedric.pelle

