记一次使用 docker-compose 搭建 sonarqube 踩过的坑

本贴最后更新于 1784 天前,其中的信息可能已经斗转星移

心情

这次搭建从 0 到 1 整个耗时一下午加一个晚上,查文档,找问题,看的我眼睛都花了。不过最后成功之后还是会感受到了胜利的喜悦 ❤️ 。

调研

先调研了一下 sonar 的版本以及特性,目前最新版本为 8.0,最新稳定版本为 7.9。由于性能原因,sonar 从 7.9 之后就不在支持 MySQL,替代方案为 postgres。

选型

所以这次就选择了 postgres:12sonarqube:7.9-community,同时在 docker-compose 文件中进行配置并启动。

问题

首先运行 postgres 并没有什么问题,遇到的 2 个问题都出现在运行 sonarqube 上,耗时这么久也是因为自己对操作系统的理解还是不够,定位问题定位错了,导致怎么改都没用,最后安静下来仔细思考,分析出真正的问题才得以解决。

问题 1

第一个问题就是权限问题,由于官方的镜像中使用了 elasticsearch,容器中安装 es 的用户并非 root 用户,但是我是使用 root 用户启动的 docker-compose,所以挂载到宿主机的 es 日志目录权限也很高,导致 es 权限不够并安装失败。
这里最开始以为是 SELINUX 导致的权限问题,在网上查找了好多方法并一一试验,然而并没有什么用。检讨一下,因为我的 SELINUX 状态一直是 Disabled,所以它并不会生效也不会限制我的权限,但是自己并没有早点认识到这个问题,还浪费了好几个小时调试。不过也算是学习了,知道了更多 Linux 的安全知识。
最后猜到症结所在,使用了最简单的 chmod -R 777 xxx 命令,授权给了挂载目录,重启,生效。

问题 2

第二个问题是在解决上面问题并正常启动之后,发现容器自己停掉了,但是一旦日志文件产生了,问题就好排查了。查看日志,如下:

ERROR: [1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

科学检索了一下,很多人都遇到过,是给 elasticsearch 分配内存的配置问题,解决方法为在宿主机执行:sysctl -w vm.max_map_count=262144

vm.max_map_count 参数,是允许一个进程在 VMA 中拥有的最大数量(VMA:虚拟内存地址, 一个连续的虚拟地址空间),当进程占用内存超过时, 直接 OOM。

由于 elasticsearch 占用内存较高。官方要求 max_map_count 需要配置到最小 262144。

max_map_count 配置文件写在系统的 /proc/sys/vm

通过 docker inspect 命令, 可查看 docker 使用宿主机的 /proc/sys 作为只读路径之一。说明镜像使用宿主机的 max_map_count 参数。因此直接修改宿主机的 max_map_count 参数即可。

通过这个问题,又对 Linux 的进程内存管理有了更多的了解,所以也不算亏吧

附录

最后附上 docker-compose.yml:

version: '3'
services:
  postgres:
    image: postgres:12
    restart: always
    container_name: postgres
    ports:
      - 5432:5432
    volumes:
      - /opt/postgres/postgresql/:/var/lib/postgresql
      - /opt/postgres/data/:/var/lib/postgresql/data
    environment:
      TZ: Asia/Shanghai
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
      POSTGRES_DB: sonar

  sonar:
    image: sonarqube:7.9-community
    container_name: sonar
    depends_on:
      - postgres
    volumes:
      - /opt/sonarqube/extensions:/opt/sonarqube/extensions
      - /opt/sonarqube/logs:/opt/sonarqube/logs
      - /opt/sonarqube/data:/opt/sonarqube/data
      - /opt/sonarqube/conf:/opt/sonarqube/conf
    ports:
      - 9000:9000
    environment:
      SONARQUBE_JDBC_USERNAME: sonar
      SONARQUBE_JDBC_PASSWORD: sonar
      SONARQUBE_JDBC_URL: jdbc:postgresql://postgres:5432/sonar
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    491 引用 • 917 回帖
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    47 引用 • 25 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...