○○さんへ
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ファイルは実行されないと思ってください.