Docker Postgresのスクリプトでユーザー/データベースを作成する方法 質問する

Docker Postgresのスクリプトでユーザー/データベースを作成する方法 質問する

私はカスタムユーザーとデータベースを作成して、開発用Postgresインスタンスのコンテナをセットアップしようとしています。公式 postgres docker イメージドキュメントでは、/docker-entrypoint-initdb.d/カスタム パラメータを使用してデータベースを設定するために、フォルダー内に bash スクリプトを挿入するように指示されています。

私の bash スクリプト: make_db.sh

su postgres -c "createuser -w -d -r -s docker"
su postgres -c "createdb -O docker docker"

Dockerファイル

FROM library/postgres

RUN ["mkdir", "/docker-entrypoint-initdb.d"]
ADD make_db.sh /docker-entrypoint-initdb.d/

docker logs -f db(db はコンテナ名です)から取得したエラーは次のとおりです:

createuser: データベースに接続できませんでした postgres: サーバーに接続できませんでした: そのようなファイルまたはディレクトリはありません

フォルダー内のコマンドは、/docker-entrypoint-initdb.d/postgres が起動される前に実行されているようです。質問ですが、公式の postgres コンテナーを使用して、ユーザー/データベースをプログラムで設定するにはどうすればよいでしょうか? スクリプトを使用してこれを行う方法はありますか?

ベストアンサー1

編集 - 2015年7月23日以降

公式 postgres docker イメージ.sqlフォルダー内にあるスクリプトを実行します/docker-entrypoint-initdb.d/

したがって、必要なのは次の SQL スクリプトを作成することだけです。

初期化SQL

CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;

これを Dockerfile に追加します:

Dockerファイル

FROM library/postgres
COPY init.sql /docker-entrypoint-initdb.d/

しかし、2015 年 7 月 8 日以降、ユーザーとデータベースを作成するだけであればPOSTGRES_USER、、POSTGRES_PASSWORDおよびPOSTGRES_DB環境変数を使用する方が簡単になります。

docker run -e POSTGRES_USER=docker -e POSTGRES_PASSWORD=docker -e POSTGRES_DB=docker library/postgres

または Dockerfile を使用します:

FROM library/postgres
ENV POSTGRES_USER docker
ENV POSTGRES_PASSWORD docker
ENV POSTGRES_DB docker

2015年7月23日より前の画像

からpostgres Docker イメージのドキュメント、 と言われている

[...] そのディレクトリにある *.sh スクリプトをソースとして取得し、[ /docker-entrypoint-initdb.d] サービスを開始する前にさらに初期化を実行します。

ここで重要なのは、「サービスを開始する前」です。つまり、スクリプトmake_db.sh はpostgres サービスが開始される前に実行されるため、「データベース pos​​tgres に接続できませんでした」というエラー メッセージが表示されます。

その後にもう一つ役立つ情報があります:

初期化の一環として SQL コマンドを実行する必要がある場合は、Postgres シングル ユーザー モードの使用を強くお勧めします。

確かに、一見すると少し不思議に思えるかもしれません。初期化スクリプトは、アクションを実行する前に postgres サービスをシングル モードで起動する必要があると書かれています。したがって、make_db.kshスクリプトを次のように変更すると、希望どおりに近づくはずです。

: これは最近変更されました次のコミットこれは最新の変更で機能します:

export PGUSER=postgres
psql <<- EOSQL
    CREATE USER docker;
    CREATE DATABASE docker;
    GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL

以前は、モードの使用が--single必要でした:

gosu postgres postgres --single <<- EOSQL
    CREATE USER docker;
    CREATE DATABASE docker;
    GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL

おすすめ記事