すでに存在する企業データベースを表すdockerfileを構築したいと考えています。同様に、psqlダンプを復元して開始するdockerファイルを作成したいと思います。
psql_dump.sql
ディレクトリに.
があります。
FROM postgres
ADD . /init_data
run "createdb" "--template=template0" "my_database"
run "psql" "-d" "my_database" --command="create role my_admin superuser"
run "psql" "my_database" "<" "init_data/psql_dump.sql"
これで十分だと思いました。 .sh
スクリプトを使用するソリューションを避けたい。 このソリューション のように。
Psqlのドキュメントには、元のデータベースと同じユーザーを作成する必要があり、復元する前にtemplate0でデータベースを作成する必要があると書かれているため、template0を使用します。
ただし、エラーが発生します。
createdb: could not connect to database template1: could not connect to server: No such file or directory
Is the server running locally and accepting
また、アプリケーション全体でdocker composeを使用しています。docker-composeでこの問題を解決する方が良い場合は、基本のpsqlイメージを使用し、docker composeを使用してこれを実行できます。
公式のPostreSQL Dockerイメージの 使用ガイド によると、必要なものは次のとおりです。
FROM postgres
ENV POSTGRES_DB my_database
COPY psql_dump.sql /docker-entrypoint-initdb.d/
POSTGRES_DB
環境変数は、最初の実行時にmy_database
スキーマを作成するようにコンテナに指示します。
そして、コンテナの.sql
にある/docker-entrypoint-initdb.d/
ファイルが実行されます。
.sh
スクリプトを実行する場合は、/docker-entrypoint-initdb.d/
ディレクトリで提供することもできます。
コメントで述べたように、スキーマの再作成が高速であれば、@ Thomasleveilの答えは素晴らしく、簡単です。しかし、私の場合は遅いので、ドッカーボリュームを使用したかったので、次のようにしました
Dockerfile:
FROM postgres
WORKDIR /docker-entrypoint-initdb.d
ADD psql_dump.sql /docker-entrypoint-initdb.d
EXPOSE 5432
次に、それを実行し、「psql_dump.sql」ファイルから移入された後のpostgresデータを含む新しいローカルディレクトリを作成します:docker cp mypg:/var/lib/postgresql/data ./postgres-data
データを一時データフォルダーにコピーし、ボリュームが新しい一時データフォルダーにある新しいpostgres docker-composeコンテナーを起動します。
startPostgres.sh:
rm -r ./temp-postgres-data/data
mkdir -p ./temp-postgres-data/data
cp -r ./postgres-data/data ./temp-postgres-data/
docker-compose -p mini-postgres-project up
docker-compose.ymlファイルは次のとおりです。
version: '3'
services:
postgres:
container_name: mini-postgres
image: postgres:9.5
ports:
- "5432:5432"
volumes:
- ./temp-postgres-data/data:/var/lib/postgresql/data
これで、新しいマシン上で、またはpsql_dump.sqlが変更された場合に、ステップ#1および#2を実行できます。また、新しい(ただし既に初期化されている)dbが必要になるたびに、ステップ#3からのみstartPostgres.shを実行できます。そして、まだdockerボリュームを使用しています。