web-dev-qa-db-ja.com

Docker Compose + Rails:移行のベストプラクティス?

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.ymlHostが...

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するにはどうすればよいですか?

この質問と同じことを達成しようとしています

25
João Souza

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 "$@"
19
Ho Man

このアプローチでは、移行が成功しない場合にデータベースが作成されます。また、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"]
14
Dan Kohn

Makefileを使用します。

run:
    docker-compose up -d \
    && docker-compose run web rake db:create

だから、今、私はdocker-compose up私はただmake run代わりに。

4
davidpm4