注: コンテナは止めておくこと。
docker-compose.ymlを開き、db
のイメージをpostgres:15-alpineからpostgres:12-alpineに変更する。
次に、db
を定義しているブロックの下に以下を追記。
dbv15:
restart: always
image: postgres:15-alpine
networks:
- internal_network
env_file:
- .config/docker.env
volumes:
- ./dbv15:/var/lib/postgresql/data
その後、ファイル先頭にある web
の links に移動し、- db
の次の行に - dbv15
を追加。(インデントを合わせること)
保存して終了。
その後 docker compose build
で再構築。
Postgres 15側に入る。
※この先一度抜けたら作業途中のデータやコマンド履歴が飛ぶので注意!(データベースは消えないので安全)
docker compose run --rm dbv15 bash
ダンプを実行する。
PGPASSWORD=$POSTGRES_PASSWORD pg_dump --no-owner -x -h db -d $POSTGRES_DB -U $POSTGRES_USER > dump.psql
15側に流し込む。
PGPASSWORD=$POSTGRES_PASSWORD psql -h dbv15 -U $POSTGRES_USER $POSTGRES_DB < dump.psql
注: $POSTGRES_DB、$POSTGRES_USER、$POSTGRES_PASSWORD はdocker.envで設定しているので、特別な理由がなければ変更不要。
これにて15への移行は完了。
DBサービスを止める。
docker compose stop
docker-compose.yml を再度開き、先程定義した dbv15
のブロックを削除する。
また、db
のイメージをpostgres:12-alpineからpostgres:15-alpineに戻す。
その後、ファイル先頭にある web
の links に移動し、- db
の次の行に追加した - dbv15
を削除。
保存して編集を終了する。
その後、カレントディレクトリにある db
を dbv12
にリネームし、それから dbv15
を db
にリネームする。
mv db dbv12 && mv dbv15 db
これでPostgres 12で動いていたときのデータは dbv12 ディレクトリに移動し、Postgres 15に移行したデータは db に移動した。
再び docker compose build
で再構築する。
完了後、docker compose run --rm web pnpm run migrate
でマイグレーションを行いつつDBが正常に利用できることを確認する。
最後に docker compose up -d
で起動し、インスタンスにアクセスできれば成功。