296

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

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

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

Dockerfile

FROM library/postgres

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

docker logs -f db(dbは私のコンテナ名です)から得られるエラーは次のとおりです。

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

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

4

8 に答える 8

501

編集 - 2015 年 7 月 23 日以降

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

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

init.sql

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

それを Dockerfile に追加します。

Dockerfile

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

しかし、2015 年 7 月 8 日以降、ユーザーとデータベースを作成するだけでよい場合はPOSTGRES_USER、環境変数POSTGRES_PASSWORDPOSTGRES_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 image のドキュメントから、

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

ここで重要なのは「サービス開始前」です。これは、postgres サービスが開始される前にスクリプトmake_db.shが実行されることを意味するため、 「データベース 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
于 2014-10-28T00:58:38.590 に答える
17

init ディレクトリ内に .sql ファイルを配置できるようになりました。

ドキュメントから

このイメージから派生したイメージで追加の初期化を行う場合は、1 つ以上の *.sql または *.sh スクリプトを /docker-entrypoint-initdb.d の下に追加します (必要に応じてディレクトリを作成します)。エントリポイントが initdb を呼び出してデフォルトの postgres ユーザーとデータベースを作成した後、すべての *.sql ファイルを実行し、そのディレクトリにあるすべての *.sh スクリプトをソースして、サービスを開始する前にさらに初期化を行います。

したがって、.sql ファイルをコピーすると機能します。

于 2015-09-02T00:15:25.187 に答える
4

ユーザーを作成する前に、データベースを実行する必要があります。このためには、複数のプロセスが必要です。シェル スクリプトのサブシェル (&) で postgres を開始するか、または Supervisord などのツールを使用して postgres を実行してから、初期化スクリプトを実行することができます。

Supervisord と Docker のガイドhttps://docs.docker.com/articles/using_supervisord/

于 2014-10-28T00:39:41.647 に答える