For

2023.5.31

同一Dockerネットワーク内にPostgreSQLコンテナが複数になったときデフォルトlistenポートを任意のポートにカスタマイズする方法

概要

マイクロサービスアーキテクチャでの開発をする機会があり、同一Dockerネットワーク内にPostgreSQLコンテナを複数立ち上げてそれらに接続する複数プロジェクトをいったりきたりしながら並行して開発するとき、開発プロジェクトを切り替えるたびに使用していたPostgreSQLのコンテナをDOWNして、これから開発するコンテナをUPしなければならずかなり煩わしいです。
listenポートがかぶらないように、開発中は任意のポートでlistenできるようカスタマイズしたいと思います。

手順

設定ファイルはどこか

PostgreSQLの設定ファイルは /var/lib/postgresql/data/postgresql.conf にあります。
結論から言うとこのファイルに追記したら良いだけなのですが、Docker環境だからといってあらかじめ任意のポート設定を追記済みの postgresql.confdocker-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 します。
次に .envDATABASE_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にカスタマイズして接続確認までできました。
複数プロジェクトで開発するような場合に、良かったら使ってみてください。