わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

DockerのPostgreSQLで,永続化を有効化・無効化するには

 ○○さんへ
 takehikomです.docker-compose.yamlを見ました.

    volumes:
      - ./sql:/docker-entrypoint-initdb.d
      - ./data:/var/lib/postgresql/data

 上記記述について,致命的なミスというわけではありませんが,一方のみを有効にするのがよさそうに思いました.
 それと,メール本文で,実行しているコマンドについても承知しました.コンテナが稼働しているとき,「docker compose exec コンテナ名 コマンド」で,テーブルをドロップして作り直して(sql/init.sqlの内容をもとに)初期データを登録し直すのは,ベストプラクティスではありません.

 データベースの初期化・保存・読み出しなどについては,以下の要領にしてください.以下のファイル名・フォルダ名はローカルのものです(コンテナのディレクトリ名は,yamlファイルに記述のもののみです).

  • sql/init.sqlの内容が適切かを検証するのが目的で,このファイルを何度も修正することになる場合には,docker-compose.yamlの「- ./data:/var/lib/postgresql/data」の行の先頭に「#」を書いて無効化してから,コンテナの起動や停止を行ってください.
  • sql/init.sqlの内容に基づき,データベースのテーブルやレコードを設定し,永続化したい場合には,コンテナが起動していない状態で,dataフォルダを削除するか,このフォルダをdata.bakのように名前を変更し,docker-compose.yamlのvolumesの設定を有効に(「#」を書いていたら除去)してから,コンテナを起動してください.
  • sql/init.sqlは使用せず,dataフォルダの内容に基づきデータベースを使用したい場合は,コンテナが起動していない状態で,docker-compose.yamlの「- ./sql:/docker-entrypoint-initdb.d」の行の先頭に「#」を書いて無効化してから,コンテナを起動してください.

 ボリュームマウントによって,コンテナ内の/var/lib/postgresql/dataにローカルのファイルが反映され,テーブルやレコードが復元したときには,/docker-entrypoint-initdb.d に置かれたsqlファイルは実行されないと思ってください.