云计算百科
云计算领域专业知识百科平台

本地docker-desktop中的容器docker与本地pgsql进行对接

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。

赞(0)
未经允许不得转载:网硕互联帮助中心 » 本地docker-desktop中的容器docker与本地pgsql进行对接
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!