ruby-on-rails - 每次 Gemfile 更新后 docker-compose 重建?

标签 ruby-on-rails docker docker-compose dockerfile docker-machine

我将首先解释什么是有效的:

我使用来自 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/

相关文章:

docker - 为什么 Kafka 代理连接到自身?

ruby-on-rails - Rails 控制台无密码供应错误

docker - 自定义端口在Docker-compose中不起作用

ruby-on-rails - cucumber 错误得到抑制(未完全显示)

docker - 如何使用 Docker Hub 在特定架构上构建 Docker 镜像?

java - 从 Docker 容器将 Log4j2 日志写入远程服务器会出错

java - Spring 的 Testcontainers 不将连接返回到池

docker - 指定 docker 容器的日志文件

ruby-on-rails - 在rails中直接编写SQL查询是一个好习惯吗?

mysql - 事件记录 : LEFT OUTER self-JOIN with conditions on joined table