泊坞窗撰写rails应用程序正在请求迁移,当它已经在内部运行时运行

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

文件夹结构:

 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"] 

它build立良好,我可以看到迁移成功运行。

接下来,我使用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 

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

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

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

好的,所以解决方法是在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中删除迁移和服务器启动命令