Docker Compose + Rails:迁移的最佳实践?

Joã*_*uza 26 ruby-on-rails docker dockerfile docker-compose

我刚刚阅读了有关在Docker中运行Rails开发环境的这篇文章.好文章,效果很好.设置完所有后,我决定继续设置生产环境.

目标:

我希望rake db:create && rake db:migrate每次运行我的泊坞窗图像.

问题:

如果我移动数据库创建和迁移步骤...

docker-compose run app rake db:create
docker-compose run app rake db:migrate
Run Code Online (Sandbox Code Playgroud)

...进入Dockerfile ...

RUN rake db:create && rake db:migrate
Run Code Online (Sandbox Code Playgroud)

......会引发错误......

could not translate host name "postgres" to address: Name or service not known
Run Code Online (Sandbox Code Playgroud)

...因为hostdatabase.yml...

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  timeout: 5000
  username: postgres
  host: postgres
  port: 5432

development:
  <<: *default
  database: rails_five_development
Run Code Online (Sandbox Code Playgroud)

...设置为postgres我的docker-compose.yml...中指定的服务名称

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
Run Code Online (Sandbox Code Playgroud)

......因为这是文章指出的推荐做法.

题:

rake db:create && rake db:migrate每次运行docker镜像时如何自动进行?

我试图在这个问题上实现同样的目的

Ho *_*Man 20

来自https://docs.docker.com/engine/reference/builder/#cmd:

如果您希望容器每次都运行相同的可执行文件,那么您应该考虑将ENTRYPOINT与CMD结合使用.请参阅ENTRYPOINT

https://docs.docker.com/engine/reference/builder/#entrypoint

TL;博士

您可以定义一个entrypointunder app并在那里定义一个bash文件:

app:
  entrypoint: [bin/entry]
  ..
Run Code Online (Sandbox Code Playgroud)

bin/entry文件示例:

#!/bin/bash
set -e

rake db:create
rake db:migrate

exec "$@"
Run Code Online (Sandbox Code Playgroud)


Dan*_*ohn 15

如果迁移无法成功,此方法将创建数据库.它还避免了因为丢失了pid文件而无法启动服务器的问题.将文件创建为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 "$@"
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml然后包括:

entrypoint: ["/app/lib/docker-entrypoint.sh"]
command: ["rails","server","-b","0.0.0.0","-p","3000"]
Run Code Online (Sandbox Code Playgroud)

  • 如果由于某种原因迁移失败,将重建数据库。不危险吗? (3认同)