所以我预先构建了一个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
答案 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终端