Sonarqube9.9 docker 镜像启动后 conf 下的配置文件没有了

目录

[问题根源(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

缺点:命名卷路径很深,不方便直接在宿主机编辑文件。

常见踩坑补充

  1. 权限问题 挂载后即便有文件,启动报错无法读取配置:宿主机目录属主必须改成 999

    chown -R 999:999 /data/sonarqube

CentOS/RHEL 开启 SELinux 可加上挂载标识 :z -v /data/sonarqube/conf:/opt/sonarqube/conf:z

  1. 不要直接新建空 sonar.properties 缺少大量默认配置项,启动会异常,务必从镜像复制原始模板修改。

  2. 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
相关推荐
%KT%1 小时前
ubuntu系统部署docker
运维·docker·容器
十二同学啊2 小时前
Docker 容器化技术详解:镜像、容器、网络与应用部署设计
网络·docker·eureka
I'mChloe2 小时前
不再逐台装Docker:我用Ansible Playbook批量统一服务器环境
服务器·docker·ansible
江湖有缘2 小时前
Docker实战 | 使用Docker部署Readeck书签管理工具
java·docker·eureka
十二同学啊3 小时前
Python FastAPI 项目使用 Docker 部署并映射端口(完整教程)
python·docker·fastapi
flytalei3 小时前
Kubernetes健康检查探针
云原生·容器·kubernetes
java_logo3 小时前
Docker 部署 Halo:轻松搭建开源个人博客
docker·容器·开源·博客·开源博客·halo·轩辕镜像
Linux实战笔记4 小时前
Docker多阶段构建优化生产配置手记:镜像瘦身最佳实践
ci/cd·docker·生产环境·多阶段构建·镜像瘦身
誰能久伴不乏4 小时前
QT工业上位机一次「指令静默丢失」的排查
qt·docker·github
TTATTC4 小时前
定时增量每 5 秒全表扫一遍?我用 DBSyncer 跑了三组对照实验才找到原因
docker·开源