2017-05-15 12 views
1

私はpostgres:9.5.6-alpineコンテナとそれにリンクする必要のあるwebという別のコンテナを持っています。 dbとユーザを作成してバックアップを復元するために、起動してdocker-entrypoint.shを実行した後に、postgresコンテナにcreate_db.shという名前のスクリプトを実行したいとします。 マイdocker-compose.yml(postgresの部):docker-composeのコンテナエントリポイントの後にスクリプトを実行

postgres: 
    build: ./postgres 
    container_name: postgres 
    volumes: 
     - /shared_folder/postgresql:/var/lib/postgresql 
    ports: 
     - "5432:5432"  
    command: sh /home/create_db.sh 

create_db.shの内容は次のとおりです。私は理解してきた

Attaching to postgres, web 
postgres | psql: could not connect to server: No such file or directory 
postgres | Is the server running locally and accepting 
postgres | connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"? 

#!/bin/sh 

psql -d template1 -U postgres 
psql --command "CREATE USER user WITH PASSWORD 'userpassword';" 
psql --command "CREATE DATABASE userdb;" 
psql --command "GRANT ALL PRIVILEGES ON DATABASE userdb to user;" 
psql —-command “\q;” 
psql -U user -d userdb -f /var/lib/postgresql/backup.sql 

exit 

私はdocker-compose buildを実行し、その後docker-compose up私はこれを取得しますこれは、私がcreate_db.sh postgresサーバを起動したときに準備ができていないためですが、どうしたらt後に実行できますか彼は容器のdocker-entrypoint.shですか?

+0

'docker-entrypoint.sh'の中に' create_db.sh'ファイルの内容を追加するべきだと思います。これはあなたの問題を解決します。 –

答えて

3

元のcommandを上書きしています。このスクリプトではpostgresを起動しないため、データベースが利用できません。

データベース初期化をコンテナのエントリポイントディレクトリ/docker-entrypoint-initdb.dに置くことができます。これにより、このディレクトリ内のファイル*.sh*.sqlがすべて実行され、元のファイルcommandには触れません。
このディレクトリのすべてのファイルは、コンテナ作成のアルファベット順に自動的に実行されます。したがって、ボリュームを作成してスクリプト/ SQLファイルをエントリポイントに追加し、コンテナにそれらを実行させます。これは、公式のpostgresのドキュメント"How to extend this image"のセクションに記述されています。ローカルディレクトリに対し

postgres: 
    build: ./postgres 
    volumes: 
    - /shared_folder/postgresql:/var/lib/postgresql 
    - ./db-init-scripts:/docker-entrypoint-initdb.d 
    ports: 
    - "5432:5432" 

、例えば:

お使いのコンファイルは、このようなものに変更しますdb-init-scriptsには、初期化スクリプトが含まれています(必要に応じて名前を変更します)。 create_db.shをこのフォルダにコピーすると、新しいコンテナを作成すると自動的に実行されます。

いくつかのデータベースイメージがこのエントリポイントディレクトリを監視します。これは非常に便利です。

container_name: postgresが冗長であるようです。

+0

ありがとうございます。正常に動作します – SegFault

関連する問題