2017-04-20 4 views
1

私はdocker-compose.ymlファイルの単純なレールアプリケーションを持っています。 これは、PostgreSQLを備えたdb containerと、rails appを備えたWebコンテナの2つのコンテナで構成されています。 Webパーツのためdockerfileでレールドッカーのベストプラクティスdb:create db:migrate

私はラインすくいデシベルでそうCMD

CMD RAILS_ENV=production rake db:create db:migrate && \ 
    bundle exec rails s -p 3000 -b '0.0.0.0' --environment=production 

で、このようなラインを持っている:DBを作成します。それは、DBコンテナ、および実行移行の最初の実行であれば、私は、DBを作成して移行します。

しかし、それは、Webパーツの更新のみである場合 - 私はデシベルを実行するだけです:移行、およびデシベル:(それがなければならないとして)エラーを私に細かい作業

ERROR: database "myapp_production" already exists 
STATEMENT: CREATE DATABASE "myapp_production" ENCODING = 'unicode' 

すべてを与える作成するが、私はそこだと思いますより良い方法です。
この状況を処理する最も良い方法は何ですか?

答えて

1

私は同じ開発スタックを持っており、ここで私がやっていることです。

ここ

は、私は延長だpostgresのためDockerfileです:

FROM postgres:9.4 

ADD db/init.sql /docker-entrypoint-initdb.d/ 

EXPOSE 5432 
CMD ["postgres"] 

docker postgresドキュメントから:

あなたはこの1から を得られる画像に追加の初期化を行うしたい場合*.sqlまたは*.shのスクリプトを /docker-entrypoint-initdb.dに追加します(必要に応じてディレクトリを作成します)。 エントリポイントは、デフォルトのpostgresユーザ とデータベースを作成するためにinitdbを呼び出した後、それはどんな*.sqlファイルを実行して サービスを開始する前に、さらに初期化を行うには、そのディレクトリで見つかった*.shスクリプト を供給します。

#!/usr/bin/env bash 

echo "Bundling gems" 
bundle install --jobs 8 --retry 3 

echo "Clearing logs" 
bin/rake log:clear 

echo "Run migrations" 
bundle exec rake db:migrate 

echo "Seed database" 
bundle exec rake db:seed 

echo "Removing contents of tmp dirs" 
bin/rake tmp:clear 

echo "Starting app server ..." 
bundle exec rails s -p 3000 -b '0.0.0.0' 

それだ:

マイinit.sqlrun.shスクリプトにwebコンテナポイントで私のRUNコマンドその後

CREATE USER database_user; 
CREATE DATABASE database_production; 
GRANT ALL PRIVILEGES ON DATABASE database_production TO database_user; 

。私のデータベースはdbコンテナに作成され、webアプリは移行のみ行います。

+0

ええ、ありがとう、私の唯一のアイデアは、Webコンテナレベルではなく、dbコンテナ作成レベルで何らかの 'db:create'を実行することでした。 – ShockwaveNN

関連する問題