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
用于容器内的交互式终端
所以我预先构建了 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
用于容器内的交互式终端