8

postgres イメージから Dockerfile を作成しようとしています。リポジトリによると、/docker-entrypoint-initdb.d/ にシェル スクリプトを配置して初期化を処理する必要があります。オンラインで見つけた例に基づいて、次のスクリプトを作成しました。

#!/bin/bash
echo "******CREATING DOCKER DATABASE******"
gosu postgres postgres --single <<- EOSQL
   CREATE DATABASE orpheus;
   CREATE USER docker WITH ENCRYPTED PASSWORD 'pwd_docker';
   GRANT ALL PRIVILEGES ON DATABASE orpheus to docker;
   CREATE TABLE profiles ( \
     profile_id    SERIAL UNIQUE PRIMARY KEY, \
     user_id integer NOT NULL UNIQUE, \
     profile_photo_id integer NOT NULL UNIQUE, \
     age integer \
   );
   CREATE TABLE hidden_user ( \
     owner_id    integer NOT NULL PRIMARY KEY, \
     target_id integer NOT NULL \
   );
EOSQL
echo ""
echo "******DOCKER DATABASE CREATED******"

そうしないと解析エラーが発生するため、バックスラッシュが必要なようです。スクリプトはエラーなしで実行され、CREATE TABLE コマンドを除くすべてのコマンドが効果を発揮したようです。

シングル ユーザー モードでテーブルの作成がサポートされていないということですか。もしそうなら、dockerfile に postgres で作成されたテーブルでイメージを設定させるより良い方法はありますか?

4

3 に答える 3

10

@a_horse_with_no_name は、彼のコメントで私を正しい軌道に乗せました。「推奨」されていたとしても、シングルユーザーモードを捨てることにしました。代わりに、pg_ctl で postgres を開始し、作成したテーブルを含むいくつかの sql ファイルをロードし、pg_ctl でサーバーを停止します。

私のシェルスクリプトは次のようになります。

#!/bin/bash
echo "******CREATING DOCKER DATABASE******"

echo "starting postgres"
gosu postgres pg_ctl -w start

echo "bootstrapping the postgres db"
gosu postgres psql -h localhost -p 5432 -U postgres -a -f /db/bootstrap.sql

echo "initializing tables"
gosu postgres psql -h localhost -p 5432 -U postgres -d orpheus -a -f /db/setup.sql

echo "stopping postgres"
gosu postgres pg_ctl stop

echo "stopped postgres"


echo ""
echo "******DOCKER DATABASE CREATED******"
于 2015-01-31T00:46:19.373 に答える
0

あなたのスクリプトをテストしましたが、ほとんど問題なく動作しています。Postgresql 9.4 を使用して、以下を機能させることができました。

gosu postgres postgres --single -jE <<- EOSQL
   CREATE DATABASE orpheus;
EOSQL
echo    
gosu postgres postgres --single -jE orpheus <<- EOSQL
   CREATE USER docker WITH ENCRYPTED PASSWORD 'pwd_docker';
   GRANT ALL PRIVILEGES ON DATABASE orpheus to docker;
   CREATE TABLE profiles (
     profile_id    SERIAL UNIQUE PRIMARY KEY,
     user_id integer NOT NULL UNIQUE,
     profile_photo_id integer NOT NULL UNIQUE,
     age integer
   );
   CREATE TABLE hidden_user (
     owner_id    integer NOT NULL PRIMARY KEY,
     target_id integer NOT NULL
   );
EOSQL
echo

create database基本的に、複数行のスクリプトでは使用できないとpostgresql が訴えていたため、スクリプトを 2 つに分割する必要がありました。orpheusもう 1 つは、2 番目のコマンドでデータベース名を追加するだけでした。

そしてほら

于 2015-05-05T18:49:29.037 に答える