SonarQubeをdocker-composeで構築する


# はじめに

過去にHomebrewでmacにSonarQubeを構築していました。
[SonarQubeをGradleから起動する](https://qiita.com/mabubu0203/items/2f2b4fdb1fa4bb0bb957)
今回、docker-composeから起動するように設定しました。

# やりたいこと

1. docker-composeでMySqlを起動(WebApp用)
2. docker-composeでMySqlを起動(SonarQube用)
3. docker-composeでSonarQubeを起動

# 順序とか

1. Mysqlの立ち上げ
2. Create Database × 2
3. Create User
4. SonarQubeの起動

# 成果物

- docker
	- [mysql]
		- [conf]
			- custom.cnf
		- [init]
			- 1_create_db.sql
			- 2_create_user.sql
			- 3_grant.sql
	- [sonarqube]
	- docker-compose.yml

```yaml:./docker-compose.yml
version: '3.5'

services:

  mysql:
    image: mysql:5.7.21
    container_name: mysql
    ports:
      - 3306:3306
    volumes:
      - ./mysql/init:/docker-entrypoint-initdb.d
      - ./mysql/conf/:/etc/mysql/conf.d
    networks:
      - sonarnet
    environment:
      MYSQL_ROOT_PASSWORD: root
    restart: always
    
  sonarqube:
    image: sonarqube:7.0
    container_name: sonarqube
    depends_on:
      - mysql
    volumes:
      - sonarqube_conf:/opt/sonarqube/conf
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_bundled-plugins:/opt/sonarqube/lib/bundled-plugins
    networks:
      - sonarnet
    command: -Dsonar.web.context=/sonarqube
    ports:
      - 9000:9000
      - 9092:9092
    environment:
      - SONAR_JDBC_USERNAME=sonar
      - SONAR_JDBC_PASSWORD=sonar
      - SONAR_JDBC_URL=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8
    restart: always
    
networks:
  sonarnet:
    driver: bridge
    
volumes:
  sonarqube_conf:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_bundled-plugins:
```

```text:./mysql/conf/custom.cnf
[mysqld]
character-set-server=utf8
lower_case_table_names=1
explicit_defaults_for_timestamp=true
```

```sql:./mysql/init/1_create_db.sql
-- WebApp用
CREATE DATABASE IF NOT EXISTS items DEFAULT CHARACTER SET UTF8;
-- SonarQube用
CREATE DATABASE IF NOT EXISTS sonar DEFAULT CHARACTER SET UTF8;
```

```sql:./mysql/init/2_create_user.sql
CREATE USER 'sonar' IDENTIFIED BY 'sonar';
```

```sql:./mysql/init/3_grant.sql
GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
FLUSH PRIVILEGES;
```

[サンプル・コード](https://github.com/mabubu0203/ItemControl)

# 起動方法

```lang:コマンド
$ cd docker
$ docker-compose -f docker-compose.yml build
$ docker-compose -f docker-compose.yml up -d
```

# 停止方法

```lang:コマンド
$ cd docker
$ docker-compose -f docker-compose.yml stop
```

# つまったところ

## MySql編(複数DatabaseCreateが実行されない)

`/docker-entrypoint-initdb.d`にマウントした際、
その配下に`.sh`,`.sql`ファイルが存在していたら実行してくれるみたい。
[docker-entrypoint.sh](https://github.com/docker-library/mysql/blob/master/5.7/docker-entrypoint.sh)
なのに全然動かない。。。

```yaml:動かないdocker-compose.yml
services:

  mysql:
    image: mysql:5.7.21
    container_name: mysql
    ports:
      - 3306:3306
    volumes:
      - ./mysql/init:/docker-entrypoint-initdb.d
      - ./mysql/conf/:/etc/mysql/conf.d
    command: mysqld --lower_case_table_names=1 --skip-ssl
    environment:
      MYSQL_ROOT_PASSWORD: root
    restart: always
    
```

解決策として、`command`フィールドを削除しました。

## SonarQube編(Connectionが繋がらない)

ネットで漁った設定をしてみる。
-> Connectionが通らない

```yaml:動かないdocker-compose.yml
services:

  sonarqube:
    image: sonarqube:7.0
    container_name: sonarqube
    depends_on:
      - mysql
    volumes:
      - sonarqube_conf:/opt/sonarqube/conf
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_bundled-plugins:/opt/sonarqube/lib/bundled-plugins
    networks:
      - sonarnet
    command: -Dsonar.web.context=/sonarqube
    ports:
      - 9000:9000
      - 9092:9092
    environment:
      - SONARQUBE_JDBC_USERNAME=sonar
      - SONARQUBE_JDBC_PASSWORD=sonar
      - SONARQUBE_JDBC_URL=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8
    restart: always
```

解決策として、`environment`フィールド内の`SONARQUBE_`プロパティを`SONAR_`に変更しました。
公式開いても`SONARQUBE_`になってる。なぜこれで動く。。。
[Dockerfile](https://github.com/SonarSource/docker-sonarqube/blob/faffed54f0edbd736d6f95132b5dc076e2f613c5/7.0/Dockerfile)

# 参考リンク
- [docker-composeでmysql使うとき初回起動時に複数のDBを作る方法](https://qiita.com/takyam/items/de87252fca60a9c914c6)
- [Docker ComposeによるMySQL, Redis, nginx, Rails構成の設定例](https://qiita.com/oshin/items/0d011610238eb4df83fd)
- [docker-composeでMySQLに接続する](https://qiita.com/M_Nagata/items/120831bb4e4a3deace13)
- [Docker ComposeでSonarQubeの環境を作る](https://qiita.com/ot-aoyagi/items/d97b2431fefbf5635e93)
- [SonarQubeをdocker-composeで起動する際にアクセスするURLを変更する](https://qiita.com/gyarasu/items/c7df0b244823808ec077)