web-dev-qa-db-ja.com

初期スキーマを使用してpostgres Dockerコンテナを構築する

すでに存在する企業データベースを表す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を使用してこれを実行できます。

33
jQwierdy

公式のPostreSQL Dockerイメージの 使用ガイド によると、必要なものは次のとおりです。

Dockerfile

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/ディレクトリで提供することもできます。

41
Thomasleveil

コメントで述べたように、スキーマの再作成が高速であれば、@ Thomasleveilの答えは素晴らしく、簡単です。しかし、私の場合は遅いので、ドッカーボリュームを使用したかったので、次のようにしました

  1. 最初に@Thomasleveil answerのようにdockerイメージを使用して、すべてのスキーマ初期化を使用してpostgresでコンテナーを作成します

Dockerfile:

FROM postgres
WORKDIR /docker-entrypoint-initdb.d
ADD psql_dump.sql /docker-entrypoint-initdb.d
EXPOSE 5432
  1. 次に、それを実行し、「psql_dump.sql」ファイルから移入された後のpostgresデータを含む新しいローカルディレクトリを作成します:docker cp mypg:/var/lib/postgresql/data ./postgres-data

  2. データを一時データフォルダーにコピーし、ボリュームが新しい一時データフォルダーにある新しい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ボリュームを使用しています。

6
yishaiz