目录
[问题根源(SonarQube 9.9 Docker)](#问题根源(SonarQube 9.9 Docker))
[方案一:先导出默认配置,再挂载(推荐,需要手动改 sonar.properties 场景)](#方案一:先导出默认配置,再挂载(推荐,需要手动改 sonar.properties 场景))
[1. 临时启动容器,拷贝默认 conf 出来(不要挂载 conf)](#1. 临时启动容器,拷贝默认 conf 出来(不要挂载 conf))
[2. 赋予权限(容器内运行用户 uid=999)](#2. 赋予权限(容器内运行用户 uid=999))
[3. 正常启动并挂载 conf](#3. 正常启动并挂载 conf)
[方案二:不挂载 conf,改用环境变量传参(官方推荐生产方式)](#方案二:不挂载 conf,改用环境变量传参(官方推荐生产方式))
[方案三:使用 docker named volume(不使用宿主机路径 bind mount)](#方案三:使用 docker named volume(不使用宿主机路径 bind mount))
问题根源(SonarQube 9.9 Docker)
宿主机空目录 bind mount 挂载 /opt/sonarqube/conf,直接覆盖容器内部自带的所有配置文件。 Docker 挂载机制:宿主机空目录挂载到容器目录 → 容器内原有文件被 "遮住",看上去全部消失。
SonarQube 9.9 官方镜像不会自动把默认配置复制进空的绑定挂载目录,这是最常见坑。
方案一:先导出默认配置,再挂载(推荐,需要手动改 sonar.properties 场景)
1. 临时启动容器,拷贝默认 conf 出来(不要挂载 conf)
bash
# 临时运行,不挂载conf
docker run --rm -d --name sonar-tmp sonarqube:9.9.0-community
# 等待10s让容器就绪,复制配置到宿主机
docker cp sonar-tmp:/opt/sonarqube/conf /data/sonarqube/
# 销毁临时容器
docker stop sonar-tmp
此时 /data/sonarqube/conf 内就有完整:sonar.properties、wrapper.conf、logback.xml
2. 赋予权限(容器内运行用户 uid=999)
chown -R 999:999 /data/sonarqube/conf
3. 正常启动并挂载 conf
docker run -d --name sonarqube9.9 \
-p 9000:9000 \
-v /data/sonarqube/conf:/opt/sonarqube/conf \
-v /data/sonarqube/data:/opt/sonarqube/data \
-v /data/sonarqube/logs:/opt/sonarqube/logs \
-v /data/sonarqube/extensions:/opt/sonarqube/extensions \
-e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true \
sonarqube:9.9.0-community
⚠️ 重点:宿主机 conf 目录必须预先存在文件,不能是空目录直接挂载
方案二:不挂载 conf,改用环境变量传参(官方推荐生产方式)
SonarQube Docker 官方不建议 bind mount conf 目录 ,升级版本容易出现配置兼容问题。 所有 sonar.properties 参数可以直接用环境变量注入: 规则:前缀 SONAR_ + 属性名,. 换成 _ 示例:
-e SONAR_JDBC_URL="jdbc:postgresql://postgres:5432/sonar"
-e SONAR_JDBC_USERNAME="sonar"
-e SONAR_JDBC_PASSWORD="xxx"
-e SONAR_WEB_CONTEXT="/sonar"
优点:不需要挂载 conf 目录,不会出现配置文件丢失问题,compose 维护更干净。
方案三:使用 docker named volume(不使用宿主机路径 bind mount)
docker volume create sonar_conf
# 先初始化volume配置
docker run --rm -v sonar_conf:/opt/sonarqube/conf sonarqube:9.9.0-community
# 正式启动挂载命名卷
-v sonar_conf:/opt/sonarqube/conf
缺点:命名卷路径很深,不方便直接在宿主机编辑文件。
常见踩坑补充
-
权限问题 挂载后即便有文件,启动报错无法读取配置:宿主机目录属主必须改成 999
chown -R 999:999 /data/sonarqube
CentOS/RHEL 开启 SELinux 可加上挂载标识 :z -v /data/sonarqube/conf:/opt/sonarqube/conf:z
-
不要直接新建空 sonar.properties 缺少大量默认配置项,启动会异常,务必从镜像复制原始模板修改。
-
Compose 完整可用模板(先执行方案一导出 conf 再使用)
version: "3.8"
services:
sonarqube:
image: sonarqube:9.9.0-community
container_name: sonarqube9.9
ports:
- "9000:9000"
environment:
SONAR_ES_BOOTSTRAP_CHECKS_DISABLE: "true"
volumes:
- /data/sonarqube/conf:/opt/sonarqube/conf
- /data/sonarqube/data:/opt/sonarqube/data
- /data/sonarqube/logs:/opt/sonarqube/logs
- /data/sonarqube/extensions:/opt/sonarqube/extensions
ulimits:
nofile:
soft: 65536
hard: 65536
快速排查命令
# 进入容器查看内部原始conf(不挂载时)
docker exec -it sonarqube ls /opt/sonarqube/conf
# 确认挂载是否生效
docker inspect sonarqube | grep Mounts -A20
