我将首先解释什么是有效的:
我使用来自 this docs 的 Docker 创建了一个新的 rails 应用程序.我跑后docker-compose up
我的 rails 应用程序将在 http://docker-ip:port 上运行.
然后在我运行这样的脚手架时在新终端中docker-compose run --rm app bundle exec rails g scaffold note title body:text
然后docker-compose run --rm app bundle exec rake db:migrate
迁移到数据库。然后当我去http://docker-ip:port -> 我的新脚手架作品。但是 Scaffolding 不需要 Rails 服务器来启动。
不工作的东西:
所以现在说我需要一个设计 gem ,我更新我的 Gemfile
在本地 sublime 文本上然后运行docker-compose run --rm app bundle install
这将按预期安装新的设计 gem。但是当我跑docker-compose run --rm app bundle exec rails g devise:install
我收到错误:Could not find bcrypt-3.1.11 in any of the sources
Run bundle install to install missing gems.
所以基本上在将设计添加到 Gemfile 之后我必须再次运行 docker-compose build
由于bundle install
,这将需要很长时间这将从头开始安装所需的所有 gem。
那么我可以在不重新构建 docker-compose 的情况下更新 Gemfile 吗?
或我错在哪里?
最佳答案
首先,关于 docker exec
的解决方法.这不是修改容器状态的好方法。如果您需要再运行一个应用容器实例怎么办? exec 不会进行任何更改。您必须再次在那里安装 gems,或者重建镜像。当您需要运行多个容器时,这种情况并不少见。例如,您使用 docker-compose up
运行开发环境,和 docker-compose run --rm web bash
在附近的终端中在第二个应用程序容器中运行 shell 并使用它来运行测试、迁移、生成器或使用 rails console
不停止由 docker-compose up 启动的容器。
现在关于解决方案。当您运行时 docker-compose run --rm app bundle install
,您创建新容器,将新的 gem 安装到其中(此操作更新 Gemfile.lock
,您会看到此更改,因为您的项目目录已安装到容器),然后退出。由于 --rm
,容器被移除旗帜。在容器中所做的更改不会影响图像。
为了避免在每次安装 gem 时重建镜像,您可以添加一个服务来存储 gem。这里是修改docker-compose.yml
,基于 docs 中的一个.
version: '3'
services:
db:
image: postgres
web:
build: .
command: bash -c "bundle install && bundle exec rails s -p 3000 -b 0.0.0.0"
volumes:
- .:/myapp
- bundle_cache:/bundle_cache
ports:
- "3000:3000"
depends_on:
- db
environment:
- BUNDLE_PATH=/bundle_cache
bundle_cache:
image: busybox
volumes:
- bundle_cache:/bundle_cache
volumes:
bundle_cache:
当您使用为所有应用程序容器存储 gem 的容器时,在运行
docker-compose down
之前,您根本不需要因为添加新 gem 而重建镜像。删除所有容器(实际上很少需要)或直到您自己删除 bundle_cache 容器。当然你不需要使用 bundle exec
对于要安装新 gem 的每个容器。所以它更容易和节省时间。但是,这需要额外的
bundle install
初始后 docker-compose build
,因为关于创建和第一次安装 /bundle_cache
对于带有应用程序的容器,它将是空的。但是在那之后,您的 gem 将存储在单独的容器中,并且该存储将可用于每个启动的应用程序容器。
关于ruby-on-rails - 每次 Gemfile 更新后 docker-compose 重建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49032151/