Running a Rails Development Environment in Docker 。でこの記事をたどっただけです。良い記事で、素晴らしい作品です。すべてをセットアップした後、本番環境。
ゴール:
Dockerイメージが実行されるたびにrake db:create && rake db:migrate
したい。
問題:
データベースの作成と移行の手順を移動した場合...
docker-compose run app rake db:create
docker-compose run app rake db:migrate
... Dockerfileに...
RUN rake db:create && rake db:migrate
...エラーがスローされます...
could not translate Host name "postgres" to address: Name or service not known
... database.yml
のHost
が...
default: &default
adapter: postgresql
encoding: unicode
pool: 5
timeout: 5000
username: postgres
Host: postgres
port: 5432
development:
<<: *default
database: Rails_five_development
... docker-compose.yml
...で指定されたpostgres
サービス名に設定されます.
version: "2"
services:
postgres:
image: postgres:9.5
ports:
- "5432"
app:
build: .
command: Rails server -p 3000 -b '0.0.0.0'
volumes:
- .:/app
ports:
- "3000:3000"
links:
- postgres
...これは、記事で指摘されている推奨されるプラクティスであるためです。
質問:
Dockerイメージが実行されるたびに自動的にrake db:create && rake db:migrate
するにはどうすればよいですか?
https://docs.docker.com/engine/reference/builder/#cmd から:
コンテナで毎回同じ実行可能ファイルを実行したい場合は、CMDと組み合わせてENTRYPOINTを使用することを検討する必要があります。 ENTRYPOINTを参照
https://docs.docker.com/engine/reference/builder/#entrypoint
tl; dr
Appの下でentrypoint
を定義し、そこでbashファイルを定義できます。
app:
entrypoint: [bin/entry]
..
bin/entryファイルの例:
#!/bin/bash
set -e
rake db:create
rake db:migrate
exec "$@"
このアプローチでは、移行が成功しない場合にデータベースが作成されます。また、pidファイルが残されているためにサーバーを起動できないという issue も回避します。ファイルをapp/lib/docker-entrypoint.sh
として作成します。
#!/bin/sh
# https://stackoverflow.com/a/38732187/1935918
set -e
if [ -f /app/tmp/pids/server.pid ]; then
rm /app/tmp/pids/server.pid
fi
bundle exec rake db:migrate 2>/dev/null || bundle exec rake db:setup
exec bundle exec "$@"
Docker-compose.ymlには次が含まれます。
entrypoint: ["/app/lib/docker-entrypoint.sh"]
command: ["Rails","server","-b","0.0.0.0","-p","3000"]
Makefileを使用します。
run:
docker-compose up -d \
&& docker-compose run web rake db:create
だから、今、私はdocker-compose up
私はただmake run
代わりに。