SonarQube 容器反复崩溃:H2 数据库损坏迁移 PostgreSQL 实战
记录日期:2026/9/3
今天容器突然反复崩溃重启,仔细查看报错信息:
Failed to get server version,Connection refused: localhost:9000
首先使用 PowerShell 指令查看容器状态:
# 看容器状态
docker ps –a —filter "name=sonar"
以下是容器状态说明:
Docker 容器状态说明
| created(已创建) | 容器已被创建(如通过 docker create 命令),但尚未启动。此时容器没有运行任何进程,也不占用 CPU 或内存资源。 |
| running(运行中) | 容器内的主进程正在正常运行,容器处于活动状态并对外提供服务。 |
| restarting(重启中) | 容器正在重新启动的过程中。这通常是由于容器配置了重启策略(restart policy)或在执行 docker restart 命令后出现的中间状态。 |
| removing(迁移中) | 这是一个过渡状态,表示容器正在被迁移到另一个 Docker 主机,或者正在被删除(如执行 docker rm 时)。 |
| paused(暂停) | 容器内所有进程都被暂停了(通过 docker pause 命令)。此时,容器仍占用内存,但 CPU 不再执行任何操作,可通过 docker unpause 恢复运行。 |
| exited(已退出/停止) | 容器内的主进程已经结束(无论是正常完成还是出错),或者容器被手动停止(如通过 docker stop 命令)。此时容器不再运行,但其文件系统等数据依然保留在磁盘上。 |
| dead(死亡) | 容器处于一种无法正常操作或恢复的严重故障状态。通常发生在 Docker 守护进程无法与容器通信等情况下。这种状态下的容器几乎无法恢复,通常只能被删除。 |
当时看到的状态是 restarting,并且多执行几次都处于这个状态,于是得知容器处于反复崩溃状态。
查看崩溃日志:
# 看崩溃日志
docker logs —tail 80 sonarqube
执行该指令后,可以看到日志中出现以下关键错误:
Caused by: org.h2.mvstore.MVStoreException: Negative position -3916
Unable to start database
定位到问题:原来是 SonarQube 内置的 H2 数据库损坏,导致容器反复重启崩溃。
先停止对应容器,防止一直空转浪费资源:
docker stop sonarqube
解决方案:将数据库迁移到 PostgreSQL
接下来是将容器迁移到 PostgreSQL 中,具体步骤如下。
1. 创建容器内网
docker network create sonarnet
2. 启动 PostgreSQL 容器
docker run –d —name postgres `
# 设定网络名称
—network sonarnet `
—restart unless-stopped `
–e POSTGRES_USER=sonar `
–e POSTGRES_PASSWORD=SonarPg2026 `
–e POSTGRES_DB=sonar `
# 设定容器数据库内容存储地址
# -v:有则存储,无则创建
# sonarqube_pgdata 自定义卷名,另一边为对应的容器内固定地址
–v sonarqube_pgdata:/var/lib/postgresql/data `
postgres:15
说明:该命令会自动拉取 postgres:15 镜像,自动创建 sonar 库和 sonar 账号,并将数据持久化到 sonarqube_pgdata 卷。
3. 停止并删除旧容器
docker stop sonarqube
docker rm sonarqube
4. 重建 SonarQube 容器并连接数据库
docker run –d —name sonarqube `
—network sonarnet `
# 设置对应监听窗口
–p 9000:9000 `
# 设置容器重启模式:除非手动 stop,否则崩溃进行重启
—restart unless-stopped `
# -e:给容器设置环境变量
# SONAR_JDBC_URL:SonarQube 官方镜像约定好的变量名,用来指定数据库连接地址(等价于改 sonar.properties)
–e "SONAR_JDBC_URL=jdbc:postgresql://postgres:5432/sonar" `
# 数据库用户名
–e "SONAR_JDBC_USERNAME=sonar" `
# 数据库用户密码
–e "SONAR_JDBC_PASSWORD=SonarPg2026" `
# 数据卷挂载
–v sonarqube_extensions:/opt/sonarqube/extensions `
–v sonarqube_data_pg:/opt/sonarqube/data `
–v sonarqube_logs:/opt/sonarqube/logs `
–v sonarqube_temp:/opt/sonarqube/temp `
# 镜像名,必须放在所有参数后
sonarqube:lts-community
关于 JDBC 连接串的说明:jdbc:postgresql://postgres:5432/sonar 是 JDBC 连接串,拆开来看:
- jdbc:postgresql://postgres:固定前缀,声明使用 PostgreSQL 驱动
- 5432:默认端口
- sonar:数据库名
4. 重建 SonarQube 容器并连接数据库
docker run –d —name sonarqube `
—network sonarnet `
# 设置对应监听窗口
–p 9000:9000 `
# 设置容器重启模式:除非手动 stop,否则崩溃进行重启
—restart unless-stopped `
# -e:给容器设置环境变量
# SONAR_JDBC_URL:SonarQube 官方镜像约定好的变量名,用来指定数据库连接地址(等价于改 sonar.properties)
–e "SONAR_JDBC_URL=jdbc:postgresql://postgres:5432/sonar" `
# 数据库用户名
–e "SONAR_JDBC_USERNAME=sonar" `
# 数据库用户密码
–e "SONAR_JDBC_PASSWORD=SonarPg2026" `
# 数据卷挂载
–v sonarqube_extensions:/opt/sonarqube/extensions `
–v sonarqube_data_pg:/opt/sonarqube/data `
–v sonarqube_logs:/opt/sonarqube/logs `
–v sonarqube_temp:/opt/sonarqube/temp `
# 镜像名,必须放在所有参数后
sonarqube:lts-community
关于 JDBC 连接串的说明:jdbc:postgresql://postgres:5432/sonar 是 JDBC 连接串,拆开来看:
- jdbc:postgresql://postgres:固定前缀,声明使用 PostgreSQL 驱动
- 5432:默认端口
- sonar:数据库名
参数说明
| –network sonarnet | 加入前面创建的内网,与 PostgreSQL 容器互通 |
| -p 9000:9000 | 映射 SonarQube 的 Web 端口到宿主机 |
| –restart unless-stopped | 容器崩溃时自动重启,除非手动停止 |
| -e "SONAR_JDBC_URL=…" | 指定数据库连接地址(等价于修改 sonar.properties) |
| -e "SONAR_JDBC_USERNAME=sonar" | 数据库用户名 |
| -e "SONAR_JDBC_PASSWORD=SonarPg2026" | 数据库用户密码 |
| -v sonarqube_extensions:… | 持久化插件目录 |
| -v sonarqube_data_pg:… | 持久化数据目录 |
| -v sonarqube_logs:… | 持久化日志目录 |
| -v sonarqube_temp:… | 持久化临时文件目录 |
验证是否成功
# 查看容器运行状态
docker ps —filter "name=sonarqube"
# 查看容器日志,确认数据库连接成功
docker logs —tail 50 sonarqube
启动完成后,浏览器访问 http://localhost:9000,使用默认管理员账号 admin / admin 登录,即可正常使用 SonarQube。
网硕互联帮助中心




评论前必须登录!
注册