web-dev-qa-db-ja.com

Docker-Compose Postgresqlインポートダンプ

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でインポートしても問題ないので、私のダンプは正しいです。

お役に立てれば幸いです。よろしくお願いします。

12
Simon

さて、トリックを見つけました。このフォルダー内のスクリプトとsqlファイルを実行するには、「docker-compose rm」を実行する必要があります。ビルドされ、削除されない場合、initフォルダーは無視されます。

[〜#〜] update [〜#〜]この問題に再度遭遇しました。今回は、作成されたイメージドッカーを削除して問題を解決しました。

14
Simon

ここでの回答は私にとって問題をある程度解決しましたが、docker-entrypoint-initdb/*.sqlスクリプトを機能させる最後のステップは、SQLスクリプト自体に構文の問題がないことを確認することでした(DockerfileでSQLバージョンを変更したため問題がありました)。 。

存在する場合、docker-entrypoint-initdb/*.sqlスクリプト内のすべてがロールバックされるようです。

構文スクリプトの問題(またはその他の問題)があるかどうかを確認するには、Dockerログを確認すると便利です。

$ docker ps -all

注:-allを使用すると、起動に失敗した可能性のある画像がリストされます。

作成した画像を見つけて、12文字のハッシュであるはずのコンテナーIDを探します。

$ docker logs baf32ff7ec03

ここでも他の回答に従う必要があることを覚えておいてください。以前に構築されたイメージをrmし、データフォルダーを削除することです(必要な場合はバックアップしてください)。

0
alexkb