動機
ローコード開発プラットフォームを色々と触ってみる中で、Pleasanterも試してみました。その際いくつか詰まったところがあったので、その記録として。
環境
- WSL2 Ubuntu24.04 LTS
- Docker 及び Docker compose plugin
本題
基本的な内容は開発元の方による以下の記事に沿っています。
変更点
- DBデータ永続化方法の変更
VolumesからBindマウントへ、これによってホストから直接コンテナが利用するディレクトリに触れるようになる
- 割り当てポートの変更
当環境では8080番ポートへつなぐ必要があったので、割り当ての変更
- /app/App_Data以下の取り扱いの変更
拡張SQL等の利用にはコンテナ内の
/app/App_Data
以下へ設定ファイルを配置する必要があるようで、上記導入記事ではそれをDockerイメージのビルドの際に行っていますが、都度ビルドするのはめんどくさそうなので
ただしこちらについては導入以降の動作確認を行っていません
.envファイル
Implem_Pleasanter_Rds_PostgreSQL_SaConnectionString='Server=pleasanter_db;Database=pleasanter_db;UID=postgres;PWD=password'
Implem_Pleasanter_Rds_PostgreSQL_OwnerConnectionString='Server=pleasanter_db;Database=#ServiceName#;UID=#ServiceName#_Owner;PWD=password'
Implem_Pleasanter_Rds_PostgreSQL_UserConnectionString='Server=pleasanter_db;Database=#ServiceName#;UID=#ServiceName#_User;PWD=password'
docker-compose.yml
services:
pleasanter:
container_name: pleasanter
image: implem/pleasanter:1.4.5.0
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}
depends_on:
pleasanter_db:
condition: service_healthy
restart: no
# volumes:
# - "./pleasanter:/app/appdata"
# volumes:
# - "./pleasanter/App_Data:/app/App_Data"
ports:
- '127.0.0.1:8880:80'
- '127.0.0.1:8881:8080'
networks:
- pleasanter_network
codedefiner:
container_name: codedefiner
image: implem/pleasanter:codedefiner
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}
depends_on:
pleasanter_db:
condition: service_healthy
restart: no
networks:
- pleasanter_network
pleasanter_db:
container_name: pleasanter_db
image: postgres:16.2
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=password
- POSTGRES_DB=pleasanter_db
- POSTGRES_HOST_AUTH_METHOD=scram-sha-256
- POSTGRES_INITDB_ARGS="--auth-host=scram-sha-256"
healthcheck:
interval: 10s
retries: 10
test: 'pg_isready -U "$$POSTGRES_USER" -d "$$POSTGRES_DB"'
timeout: 2s
restart: no
volumes:
- "./postgres:/var/lib/postgresql/data"
networks:
- pleasanter_network
networks:
pleasanter_network:
external: true
手順
-
今回の導入例では、Bindによるコンテナ内部データの永続化を行います。そのため、DBデータ等の保存先として適切なディレクトリを用意しておいてください。作業時にはそのディレクトリを使用します
volumes: - "./postgres:/var/lib/postgresql/data"
この記述がBindによるマウントを表すものでホストの
./postgres
をコンテナ内の/var/lib/postgresql/data
と紐づけるものとなります -
事前にネットワークを作成します。以下のコマンドを実行してください。
docker network create pleasanter_network
なお、ネットワーク名は任意のものに変更しても問題ありませんが、docker-compose.yml
の記述と一致させるようにしてください -
.env
ファイルおよびdocker-compose.yml
に記述されたpasswordを任意のものに変更してください。また、使用するコンテナのバージョン等も適宜指定してください
本記事ではそれぞれ以下の通りとしていますimage: implem/pleasanter:1.4.5.0 image: postgres:16.2
-
docker-compose.yml
にて、以下の通りにコメントアウトを解除してくださいvolumes: - "./pleasanter:/app/appdata" # volumes: # - "./pleasanter/App_Data:/app/App_Data"
-
古いcodedefinerのイメージがある場合
docker image rm implem/pleasanter:codedefiner
で削除してください
- 作業ディレクトリで
docker compose run --rm codedefiner _rds
を実行します。すると、設定された依存関係に従ってpleasanter_db
が立ち上がり、次いでcodedefiner
が起動します -
codedefiner
が正常に終了したら、次にdocker compose up -d pleasanter
を実行します。しばらく待つとPleasanterが立ち上がるはずなので、ブラウザでlocalhost:8881
へ接続すると、ログイン画面が表示されると思います - 再びターミナルへ戻り
docker exec -it pleasanter /bin/bash
を実行します。この操作により、コンテナの中へと入ることができます - コンテナ内で次のコマンドを実行します。
cp -r App_Data appdata
コピーが完了したらexit
でコンテナから抜けます -
docker compose down
で一旦コンテナを削除します -
docker-compose.yml
を編集して次の通りコメントアウトを設定してください# volumes: # - "./pleasanter:/app/appdata" volumes: - "./pleasanter/App_Data:/app/App_Data"
-
docker compose up -d pleasanter
でPleasanterを起動します。以降の停止・始動はdocker compose stop
とdocker compose start pleasanter
でいいんじゃないでしょうか
付記
DockerのBindマウントはコンテナ内のディレクトリを上書きするそうなので、妙な手順を踏んでいます。Dockerの運用としても良い方策とは思えないので、あんまり推奨はいたしません。