泊坞窗撰写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中删除迁移和服务器启动命令