Docker版プリザンターをSQL Serverで動かす方法

## はじめに

Docker版プリザンターも、SQL Serverで動かすことができます。  
SQL Serverもコンテナで動かすことができるので、Docker版プリザンターをDocker版SQL Serverで動かす方法を説明します。  
Docker版SQL Serverもフルテキスト検索が可能ですのでカスタムイメージとしてビルドを行います。

## 参考

- [SQL Server Docker コンテナーの構成およびカスタマイズ \- SQL Server \| Microsoft Learn](https://learn.microsoft.com/ja-jp/sql/linux/sql-server-linux-docker-container-configure?view=sql-server-ver15&pivots=cs1-bash)

## 前提

- Docker版プリザンターの環境が構築済みであること(DBの作成は不要です)

  - [Docker版プリザンターで運用する方法\(1\.4系編\) \#Pleasanter \- Qiita](https://qiita.com/imp-kawano/items/da84b02b23aa78aa41d8)

- 今回はタイムゾーンを日本に、言語を日本語にしています。適宜変更してください。

## 配置イメージ

いつものように各コンテナのビルド構成を示します。

```text
.
|-- compose.yml
|
+-- app_data_parameters
|   +-- Service.json
|   +-- Rds.json
|
+-- CodeDefiner
|   +-- Dockerfile
|
+-- Pleasanter
|   +-- Dockerfile
|
+-- SQLServer
    +-- Dockerfile
```

### パラメータファイル

最低限の変更箇所は以下の通りです。

- Rds.json
  - Dbms: `"SQLServer"` を指定します
  - 各ConnectionString: 環境変数で指定しますので `null` にします

- Service.json
  - TimeZoneDefault: SQL ServerのベースイメージはLinuxなので、Linuxのタイムゾーン  `"Asia/Tokyo"` を指定します
  - DefaultLanguage: 日本語 `"ja"` を指定します

### compose.yml

```yaml
services:
  pleasanter:
    build:
      context: .
      dockerfile: ./Pleasanter/Dockerfile
      args:
        - VERSION=${PLEASANTER_VER}
    container_name: pleasanter_${PLEASANTER_VER}
    environment:
      Implem.Pleasanter_Rds_SaConnectionString: ${Implem_Pleasanter_Rds_SQLServer_SaConnectionString}
      Implem.Pleasanter_Rds_OwnerConnectionString: ${Implem_Pleasanter_Rds_SQLServer_OwnerConnectionString}
      Implem.Pleasanter_Rds_UserConnectionString: ${Implem_Pleasanter_Rds_SQLServer_UserConnectionString}
      TZ: ${TZ}
    ports:
      - '8881:8080'
    networks:
      - default
  codedefiner:
    build:
      context: .
      dockerfile: ./CodeDefiner/Dockerfile
    container_name: codedefiner
    environment:
      Implem.Pleasanter_Rds_SaConnectionString: ${Implem_Pleasanter_Rds_SQLServer_SaConnectionString}
      Implem.Pleasanter_Rds_OwnerConnectionString: ${Implem_Pleasanter_Rds_SQLServer_OwnerConnectionString}
      Implem.Pleasanter_Rds_UserConnectionString: ${Implem_Pleasanter_Rds_SQLServer_UserConnectionString}
      TZ: ${TZ}
    networks:
      - default
    stdin_open: true
  db:
    build:
      context: .
      dockerfile: ./SQLServer/Dockerfile
    container_name: sqldb
    environment:
      ACCEPT_EULA: 'Y'
      MSSQL_SA_PASSWORD: ${SA_PASSWORD}
      TZ: ${TZ}
    ports:
      - '11433:1433'
    networks:
      - default
    volumes:
      - sqlvolume:/var/opt/mssql

volumes:
  sqlvolume:

networks:
  default:
    name: pleasanter_prod_network
```

### SQLServer/Dockerfile

フルテキスト検索を有効にするため、SQL Serverのイメージをベースにして、フルテキスト検索のインストールを行います。

```dockerfile
FROM mcr.microsoft.com/mssql/server:2019-latest

USER root

RUN apt-get update && apt-get install -yq gnupg gnupg2 gnupg1 curl apt-transport-https
RUN curl https://packages.microsoft.com/keys/microsoft.asc -o /var/opt/mssql/ms-key.cer \
  && apt-key add /var/opt/mssql/ms-key.cer \
  && curl https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2019.list -o /etc/apt/sources.list.d/mssql-server-2019.list \
  && apt-get update
RUN apt-get install -y mssql-server-fts
# Cleanup
RUN apt-get clean && rm -rf /var/lib/apt/lists

EXPOSE 1433
USER mssql
ENTRYPOINT [ "/opt/mssql/bin/sqlservr" ]
```

### 環境変数の設定

以下の環境変数を設定します。(各パスワードは適宜変更してください)

```text
PLEASANTER_VER=1.4.15.0
SA_PASSWORD=****
Implem_Pleasanter_Rds_SQLServer_SaConnectionString='Server=db;Database=master;UID=sa;PWD=****'
Implem_Pleasanter_Rds_SQLServer_OwnerConnectionString='Server=db;Database=#ServiceName#;UID=#ServiceName#_Owner;PWD=****'
Implem_Pleasanter_Rds_SQLServer_UserConnectionString='Server=db;Database=#ServiceName#;UID=#ServiceName#_User;PWD=***'
TZ=Asia/Tokyo
```

- SA_PASSWORD: SQL ServerのSAパスワードを指定します。
- SaConnectionString: パスワードは SA_PASSWORD と同じものを指定します。
- TZ: Linuxのタイムゾーンを指定します。

## イメージのビルド

各サービスをビルドします。

```bash
docker compose build --pull pleasanter codedefiner db
```

`--pull` を指定することで、イメージの更新を確認し、最新のイメージを取得します。

イメージのビルドが完了したら、コンテナを起動します。

## コンテナの起動

SQL Serverのコンテナを起動します。

```bash
docker compose up -d db
```

CodeDefinerのコンテナを起動し初期化します。  
今回は予め Service.json でタイムゾーン、言語を設定していますので `/l`, `/z` は不要です。  
自動化する場合は `/y` を付与してください。

```bash
docker compose run --rm codedefiner _rds
```

Pleasanterのコンテナを起動します。

```bash
docker compose up -d pleasanter
```

## 動作確認

ブラウザで以下のURLにアクセスします。

<http://localhost:8881>

## SQL Serverにつなぎたい

compose.yml > db > ports で 11433 を指定していますので、SSMSや各種対応ツールから接続することができます。

## コンテナの停止、ボリュームの削除

前提の記事通りです。

以上です。