Docker起動時に実行するDDL,DMLの検証のために色々ガチャガチャやってたら起動できなくなって、その原因と対処法が分かったのでメモ。
FATAL: configuration file "/var/lib/postgresql/data/postgresql.conf" contains errors LOG: could not open configuration file "/var/lib/postgresql/data/postgresql.conf": No such file or directory
postgresql.sqlがないって言われてますね。
よく見るNo such file or directoryです。
ちなみに、ガチャガチャやってる過程で以下のエラーも発生しました。これもいっしょに解消しました。
LOG: skipping missing configuration file "/var/lib/postgresql/data/postgresql.auto.conf" FATAL: "/var/lib/postgresql/data" is not a valid data directory DETAIL: File "/var/lib/postgresql/data/PG_VERSION" is missing.
以下のissueでも少し触れられていますね。
https://github.com/void-linux/void-packages/issues/13377
Dockerの仕様で発生していると思われます。
Dockerのバージョン以外はあんまり関係ないのかなと思いますが、Windows版のDockerでは発生したことがないのでどうか分からないです。
原因は、ホスト側にマウントしているPostgreSQLのファイルを削除したからでした。
以下の手順で削除したんですが、ダメだったようです。
Dockerコンテナ削除
↓
ボリューム削除
↓
PostgreSQLのファイル削除
↓
Docker Image削除
の順番に削除して、再度docker-compose upでコンテナ起動すれば完全に初期化できるやろーって思って安易に削除したのが良くなかったみたいです。
だってImageまで消してれば全部なかったことにできそうじゃんねぇ。
エラーの解決方法は、ホスト側PCにあるマウント先のディレクトリ(PostgreSQLのファイルがあるディレクトリ)ごと削除することです。
理屈は分かりませんが、ディレクトリが残っていると、「ファイルがない状態にした」つもりが、「ファイルを削除する操作をした」ことになっているんでしょうね。
Dockerがその辺の情報を管理しているのは少し意外ですが、こう考えるのが自然かなと。
まぁ、双方向バインディングみたいな状態だからそうなるのか🤔
そのため、マウント先のディレクトリを削除して、再度同じ名前のディレクトリを作成することで、このエラーは解消できます。
まとめると、以下の手順で再作成ができます。
PostgreSQLの場合、起動時にDDL, DMLを実行するように設定していると、完全初期化したいケースって多いんじゃないですかね?
その割に記事が少ないような気もしますが…。
もっといいやり方ある場合は教えてください。