1. ホーム
  2. バッシュ

[解決済み】Docker Postgresのスクリプトでユーザー/データベースを作成する方法

2022-04-19 23:42:15

質問

カスタムユーザ&データベースを作成し、開発用 postgres インスタンスのコンテナをセットアップしようとしています。私は Postgres公式Dockerイメージ . ドキュメントでは、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: データベースに接続できませんでした postgres: サーバーに接続できませんでした。そのようなファイルやディレクトリはありません

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

解決方法は?

EDIT - 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に追加してください。

ドッカーファイル

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/07/23より古い画像について

から postgres Dockerイメージのドキュメント は、次のように言われています。

<ブロッククオート

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

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

この後、もう一つ有用な情報があります。

初期化の一環として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