2023.5.31
同一Dockerネットワーク内にPostgreSQLコンテナが複数になったときデフォルトlistenポートを任意のポートにカスタマイズする方法
概要
マイクロサービスアーキテクチャでの開発をする機会があり、同一Dockerネットワーク内にPostgreSQLコンテナを複数立ち上げてそれらに接続する複数プロジェクトをいったりきたりしながら並行して開発するとき、開発プロジェクトを切り替えるたびに使用していたPostgreSQLのコンテナをDOWNして、これから開発するコンテナをUPしなければならずかなり煩わしいです。
listenポートがかぶらないように、開発中は任意のポートでlistenできるようカスタマイズしたいと思います。
手順
設定ファイルはどこか
PostgreSQLの設定ファイルは /var/lib/postgresql/data/postgresql.conf
にあります。
結論から言うとこのファイルに追記したら良いだけなのですが、Docker環境だからといってあらかじめ任意のポート設定を追記済みの postgresql.conf
を docker-compose.yml
でマウントしてしまうと、コンテナ起動時にエラーが出てコンテナが立ち上がらないので、PostgreSQLによってデフォルトの postgresql.conf
が作成されてから追記する必要があります。
追加の設定ファイルを作成
まず、以下のファイルを作成します。
text_____postgresql.custom.conf_____port=5536
私はプロジェクトルートに置いてしまいましたが、もちろん /db
などのディレクトリを作ってその中に入れておいても問題ありません。
docker-compose.ymlを作成
今回は以下のように作りました。
yml_____docker-compose.yml_____version: '3'
volumes:
node_modules:
postgres:
services:
app:
image: node:16.13.2
ports:
- 3103:3103
- 5658:5658
volumes:
- .:/workspace:cached
- node_modules:/workspace/node_modules
working_dir: /workspace
tty: true
db:
image: postgres:14
environment:
POSTGRES_DB: database
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
volumes:
- postgres:/var/lib/postgresql/data
- ./postgresql.custom.conf:/workspace/postgresql.custom.conf
ports:
- 5536:5536
app
にNext.jsアプリケーションを配置し、Prismaをインストールして5536ポートのPostgreSQLと接続するところまで見ていきます。
また、volumesで postgresql.custom.conf
をマウントしているところもポイントです。
追加設定を読み込ませる
docker compose up -d
して起動できたら、ホストPCから以下のコマンドを実行します。
terminal_____terminal_____docker compose exec db sh -c 'printf "\ninclude '\''/workspace/postgresql.custom.conf'\''\n" >> /var/lib/postgresql/data/postgresql.conf'
簡単に言うと、これでPostgreSQLが作成したデフォルトの postgresql.conf
の最終行に include '/workspace/postgresql.custom.conf'
という行が追記されます。
これは、先ほど作成した postgresql.custom.conf
にある設定をincludeして追加で読み込んでいます。
この状態で再起動したら設定が適用されるので docker compose stop
docker compose up -d
で再起動してください。
Prismaと接続
続いてPrismaから接続できるか確認します。
appコンテナ内のNext.jsアプリケーション側でPrismaをインストールし npx prisma init
します。
次に .env
に DATABASE_URL
という環境変数が定義されていると思うので、それを以下のように更新します。
text_____.env_____DATABASE_URL="postgresql://postgres:password@db:5536/database?schema=public&connect_timeout=300"
そして適当にUserモデルをPrismaのschemaに書いて置きます。
prisma_____schema.prisma_____// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
name String
}
ここまできたら npx prisma migrate dev
を実行します。
PostgreSQLへの接続確認
最後にPrisma Studioを立ち上げて確認しますが、docker-compose.yml
でPrisma Studio用のポートも5658にカスタマイズしてあるので npx prisma studio -p 5658
で立ち上げます。
まとめ
PostgreSQLのlistenポートを5536、Prisma Studioのポートを5658にカスタマイズして接続確認までできました。
複数プロジェクトで開発するような場合に、良かったら使ってみてください。