PleasanterをDockerで動かす

早速ですがPleasanter(プリザンター)をビルドしてDockerコンテナ上で動かそうと思います。
常に最新のPleasanterをお手軽に試せるようになりますね。

今回は公式のリポジトリにある`Docker Compose`ファイルを使ってみます。
- [Implem\.Pleasanter\.NetCore/docker\-compose\.yml at master](https://github.com/Implem/Implem.Pleasanter.NetCore/blob/master/docker-compose.yml)

## Composeの定義を読む

```yaml
version: '3.5'

services:
  Implem.Pleasanter:
    build:
      context: .
      dockerfile: ./Implem.Pleasanter/Dockerfile
    environment:
        - Implem.Pleasanter_Rds_PostgreSQL_SaConnectionString=${Implem_Pleasanter_Rds_PostgreSQL_SaConnectionString}
        - Implem.Pleasanter_Rds_PostgreSQL_OwnerConnectionString=${Implem_Pleasanter_Rds_PostgreSQL_OwnerConnectionString}
        - Implem.Pleasanter_Rds_PostgreSQL_UserConnectionString=${Implem_Pleasanter_Rds_PostgreSQL_UserConnectionString}
    image: implem.pleasanter
    container_name: pleasanter
    depends_on:
      - db
    networks:
      - default
```

特に変わった点はないですが環境変数の記述が冗長に見えます。
これはPleasanterが参照する環境変数名には **.** (ピリオド)が含まれていて実行環境によっては変数定義がエラーになるのを避けるための工夫です。
一度 **\_** (アンダースコア)に置きかえた変数名で実行環境に定義し、それを参照しつつ本来の変数名でコンテナに渡してあげます。

CodeDefinerのコンテナも同様です。

## データベースはどうしているか

```yaml
version: '3.5'

services:
  db:
    container_name: postgresql
    build:
      context: .
      dockerfile: ./docker-build/postgresql/Dockerfile
    environment:
      - POSTGRES_USER
      - POSTGRES_PASSWORD
      - POSTGRES_DB
    ports:
      - "5432:5432"
    volumes:
      - ./docker-build/postgresql/init:/docker-entrypoint-initdb.d
    networks:
      - default
```

DBはPostgreSQLを使うようになっています。

ユーザやDBの指定は環境変数で渡しています。 `services/db/environment`がその定義ですので適宜設定します。
環境変数に定義したものはPleasanterが参照するデータベース接続文字列にも指定します。

コンテナ定義には公式イメージを使います。初期化機能があり、この機能を使って全文検索用のモジュールを一緒にインストールしてしまいます。
- 公式のイメージ: [Postgres \- Official Image \| Docker Hub](https://hub.docker.com/_/postgres/)

`volumes`で初期化処理を所定のポイントにアタッチします。
こうすることで任意の初期化処理を実行してくれます。
初期化機能に関してはこれらのエントリが分かり易かったです。
- [dockerでPostgreSQLのコンテナ作成と初期化 - Qiita](https://qiita.com/asylum/items/17e655d8369c19affbc3)
- [Docker で作る postgres 環境 \| Crudzoo](https://crudzoo.com/blog/docker-postgres)

## ビルドする

必要な環境変数の設定をしてビルドしていきます。

```bash
export POSTGRES_USER=postgres
export POSTGRES_PASSWORD=<任意のSaパスワード>
export POSTGRES_DB=postgres

export Implem_Pleasanter_Rds_PostgreSQL_SaConnectionString='Server=db;Database=postgres;UID=postgres;PWD=<任意のSaパスワード>'
export Implem_Pleasanter_Rds_PostgreSQL_OwnerConnectionString='Server=db;Database=#ServiceName#;UID=#ServiceName#_Owner;PWD=<任意のOwnerパスワード>'
export Implem_Pleasanter_Rds_PostgreSQL_UserConnectionString='Server=db;Database=#ServiceName#;UID=#ServiceName#_User;PWD=<任意のUserパスワード>'
```

`SaConnectionString`の注意点です。

- `Server`: Composeファイルの`services`で定義した名前にします(`db`)
- `Database`: 環境変数の`POSTGRES_DB`と同じにします
- `UID`: 環境変数の`POSTGRES_USER`と同じにします
- `PWD`: 環境変数の`POSTGRES_PASSWORD`と同じにします

ではビルドしましょう。

```bash
docker-compose build
```

Windowsの場合は環境変数に以下の2つを指定してください。

1. `DOCKER_BUILDKIT`を`1`
1. `COMPOSE_DOCKER_CLI_BUILD`を`true`

## CodeDefinerの実行とPleasanterの起動

初回の場合はCodeDefinerを実行します。

```bash
docker-compose run --rm --name codedefiner Implem.CodeDefiner _rds
```

Pleasanterを起動します。

```bash
docker-compose run --rm -d -p 50001:80 --name pleasanter Implem.Pleasanter
```

`-p`の`50001`がブラウザ等でアクセスする際のURLのポートになります。(必要に応じて適宜変更してください)
`http://localhost:50001/` でアクセスしてみます。
いかがでしょうか、いつもの画面が表示されたでしょうか。

最後に終了します。

```bash
docker-compose down
```