docker compose rails 应用要求迁移到 运行,而它已经 运行 在构建中

docker compose rails app is asking for migration to be ran when it was already ran in build

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

文件夹结构:

root/
  my_app/
  Dockerfile
  docker-compose

以下是我采取的步骤:

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

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 up 在 docker-compose 文件上:

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

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

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

中删除迁移和服务器启动命令

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

docker-compose up 之后您可以向容器发送命令

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