（ナレッジ）docker-composeでsonarqubeを動かす


# やりたいこと

- sonarqubeをローカルで立ち上げて、かつデータは永続化したい
- sonarqubeにDB設定をしないとH2データベースを使ってしまうのでdocker-composeで合わせて設定する

# 前提

ローカル環境にdocker-composeが入っていること

# 手順

## 公式からサンプルファイルを取得し任意のフォルダに配置

https://github.com/SonarSource/docker-sonarqube/blob/master/example-compose-files/sq-with-postgres/docker-compose.yml

- 執筆時点では以下の記載

```docker-compose.yml
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:
      - "9000: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:
```

## `docker-compose up -d --build`で立ち上げ

- サンプルファイルはデフォルトポートをそのまま使っているので、被ってないことを確認した上で立ち上げてください

無事立ち上がればOK! :clap: 

## sonaqubeアクセス

<http://localhost:9000>

無事アクセスできればOK! :clap: 

あとは、id/pwをadmin/adminでログインして設定するだけ


# トラブルシューティング

ここからは立ち上がらなかったときの対処法のメモ

## Postgresqlのバージョンが違うよエラーがでてPostgreSQLが立ち上がらない

以下のようなエラー（バージョンは人によって違うと思います）

```
The data directory was initialized by PostgreSQL version 10, which is not compatible with this version 13.10  docker
```

- 原因
    - ボリュームに保存されているバージョンと、今起動しようとしているバージョンが違うため
- 対処法
    - 以下のコマンドで一度ボリューム含めて全削除する
        - `docker-compose down --rmi all --volumes --remove-orphans`
        - ※注記）docker-composeの設定がすべて消えます


## ElasticSearchでエラー

```
You must address the points described in the following [1] lines before starting Elasticsearch.
```

- 対処法
    - こちらを参考<https://stackoverflow.com/questions/57070176/sonarqube-7-9-1-community-troubleshooting>
    - Elasticsearch は MMap FS ディレクトリを使用してインデックスを保存します。OSのデフォルトのmmapカウントの制限値が低すぎる可能性があり、メモリ不足の例外が発生する可能性があります。以下のコマンドを入力し、sudo権限で仮想メモリの値を増やしてください、
        - デフォルトだと`vm.max_map_count`の値が低く設定されているためとのこと
        - 以下コマンドを実行して、再度立ち上げ
        - `sudo sysctl -w vm.max_map_count=262144`


# postgresqlのデフォルトポートを変更したい場合

docker-compose内で定義したsonarqubeは5432ポートを見に行くので、

ローカル環境で競合を避けたい場合は以下の★を変更するだけ

```
version: "3"
services:
  sonarqube:
    image: sonarqube:community
    hostname: sonarqube
    container_name: sonarqube
    depends_on:
      - db
    environment:
      # sonaqube is connecting to db on 5432port. ★この接続先はそのまま5432ポート
      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:
      - "9000:9000"
  db:
    image: postgres:13
    ports:
      - "25432:5432" # avoid conflict local pgsql port ★
    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:


```

- 参考

https://github.com/SonarSource/docker-sonarqube/issues/31



# 最後に

こちらの記事が参考になったら幸いです。