当 SonarQube 出现 vm.max_map_count 错误时的解决方法

当我在使用docker-compose启动SonarQube时遇到了有关vm.max_map_count的错误,并且遇到了困难,所以我决定记录下一些备忘录。

SonarQube的启动

创建下面的docker-compose.yml文件。由于9000端口已被另一个应用程序(MinIO)使用,所以改用9999端口。

version: "3"
services:
  sonarqube:
    image: sonarqube:community
    hostname: sonarqube
    container_name: sonarqube
    depends_on:
      - db
    environment:
      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar
    volumes:
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_logs:/opt/sonarqube/logs
    ports:
    - "0.0.0.0:9999:9000"
  db:
    image: postgres:13
    hostname: postgresql
    container_name: postgresql
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
      POSTGRES_DB: sonar
    volumes:
      - postgresql:/var/lib/postgresql
      - postgresql_data:/var/lib/postgresql/data

volumes:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_logs:
  postgresql:
  postgresql_data:

通过以下脚本启动。

#!/bin/bash
set -ex
if [ "$1" == "up" ]; then
  docker-compose up -d --build
elif [ "$1" == "down" ]; then
  docker-compose down
fi

在这种情况下,即使通过localhost:9999进行curl也无法连接。
使用docker logs来核实状态。

$ docker logs 862e55b4b91e
:(省略)
[2023/04/24 8:23:55.829 AM] bootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[2023/04/24 8:23:55.829 AM] ERROR: Elasticsearch did not exit normally - check the logs at /opt/sonarqube/logs/sonarqube.log
:(省略)
2023.04.23 23:36:03 INFO  app[][o.s.a.SchedulerImpl] Process[ElasticSearch] is stopped
2023.04.23 23:36:03 INFO  app[][o.s.a.SchedulerImpl] SonarQube is stopped

ElasticSearch崩溃了。进程似乎缺少可用的映射区域。
搜索后找到以下文献。
Elasticsearch的max_map_count参数的更改。

在/etc/sysctl.conf文件中添加vm.max_map_count = 262144,然后重新启动系统。这次,curl成功运行了。

$ curl localhost:9999

<!DOCTYPE html>
<html lang="en">
:(省略)
广告
将在 10 秒后关闭
bannerAds