Dockerとpostgresについて質問があります。 dockerが起動するたびに新しいpostgresデータベースをセットアップしていて、特定のダンプをインポートしたいと思っています。
私の問題は似ていますが、答えは私には十分ではありません: Docker postgresはdocker-entrypoint-initdb.dでinitファイルを実行しません
Docker-Compose:
postgres:
environment:
- POSTGRES_USER=****
- POSTGRES_PASSWORD=****
- POSTGRES_DB=****
build:
context: .
dockerfile: dockerfile-postgres
私のDockerfile:(末尾が.shのスクリプトですでに試しました)
FROM postgres
ADD dump.sql /docker-entrypoint-initdb.d/
https://hub.docker.com/_/postgres/ によると、データベースのインポートにはdump.sqlを使用する必要があります。
Dockerを使用してアプリケーションを起動すると、次のような結果になります。
postgres_1 | LOG: invalid record length at 0/1708600
postgres_1 | LOG: redo is not required
postgres_1 | LOG: MultiXact member wraparound protections are now enabled
postgres_1 | LOG: database system is ready to accept connections
postgres_1 | LOG: autovacuum launcher started
データベースがインポートされているかどうかをテストした上で、データベースにテーブルがありません。何が悪いのですか(ファイルは読み取り可能で、ターゲットシステムで実行可能です)? psqlでインポートしても問題ないので、私のダンプは正しいです。
お役に立てれば幸いです。よろしくお願いします。
さて、トリックを見つけました。このフォルダー内のスクリプトとsqlファイルを実行するには、「docker-compose rm」を実行する必要があります。ビルドされ、削除されない場合、initフォルダーは無視されます。
[〜#〜] update [〜#〜]この問題に再度遭遇しました。今回は、作成されたイメージドッカーを削除して問題を解決しました。
ここでの回答は私にとって問題をある程度解決しましたが、docker-entrypoint-initdb/*.sql
スクリプトを機能させる最後のステップは、SQLスクリプト自体に構文の問題がないことを確認することでした(DockerfileでSQLバージョンを変更したため問題がありました)。 。
存在する場合、docker-entrypoint-initdb/*.sql
スクリプト内のすべてがロールバックされるようです。
構文スクリプトの問題(またはその他の問題)があるかどうかを確認するには、Dockerログを確認すると便利です。
$ docker ps -all
注:-all
を使用すると、起動に失敗した可能性のある画像がリストされます。
作成した画像を見つけて、12文字のハッシュであるはずのコンテナーIDを探します。
$ docker logs baf32ff7ec03
ここでも他の回答に従う必要があることを覚えておいてください。以前に構築されたイメージをrmし、データフォルダーを削除することです(必要な場合はバックアップしてください)。