docker compose rails app要求迁移在已经在构建中运行时运行

时间:2017-09-08 11:03:13

标签: ruby-on-rails docker docker-compose rails-migrations

所以我预先构建了一个rails应用程序的docker镜像。构建映像时,将运行迁移。当我使用docker run运行图像时,一切正常。但是当我尝试运行docker-compose文件时,当我访问应用程序时,它告诉我需要运行迁移,但迁移是在构建步骤中运行的。

文件夹结构:

root/
  my_app/
  Dockerfile
  docker-compose

以下是我采取的步骤:

我在Dockerfile上运行docker build -t my_app .

FROM ruby:2.4-jessie

WORKDIR /usr/src/app
COPY ./my_app/Gemfile* ./
RUN bundle install
COPY ./my_app .
EXPOSE 3000

RUN rails db:migrate

CMD ["rails", "server", "-b", "0.0.0.0"]

它很好用,我可以看到迁移已成功运行。

接下来,我使用docker run -p 3000:3000 my_app

运行它

我在浏览器中访问它,一切都很好。

接下来,我在docker-compose文件上运行docker-compose up

version: '3'

services:
  my-app-container:
    image: my_app
    volumes:
      - ./my_app:/usr/src/app
    ports:
      - 3000:3000

图像开始很好但是当我在浏览中访问它时得到:

Migrations are pending. To resolve this issue, run: bin/rails db:migrate RAILS_ENV=development 

# Raises <tt>ActiveRecord::PendingMigrationError</tt> error if any migrations are pending.
def check_pending!(connection = Base.connection)
  raise ActiveRecord::PendingMigrationError if ActiveRecord::Migrator.needs_migration?(connection)
end

2 个答案:

答案 0 :(得分:0)

好的,所以解决方案是在docker-compose文件中有命令来处理rails app的迁移和启动:

version: '3'

services:
  my-app-run-container:
    image: my_app_run_container
    volumes:
      - ./my_app:/usr/src/app
    ports:
      - 3000:3000
    command: rails db:migrate
    command: rails server -b 0.0.0.0

我想如果我打算使用docker-compose,我可以从Dockerfile中删除迁移和服务器启动命令

答案 1 :(得分:0)

首先将命令添加到Dockerfile,但必须将它们添加到docker-compose.yml或手动调用

docker-compose up之后,您可以将命令发送到容器

docker exec -it 'container name/id' rails db:migrate或其他命令。 -it用于容器内的intearactive终端