首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >docker-在每次更新Gemfile之后重新构建?

docker-在每次更新Gemfile之后重新构建?
EN

Stack Overflow用户
提问于 2018-02-28 14:41:51
回答 1查看 4K关注 0票数 11

,我将首先解释什么在起作用:

我使用这个医生的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,->,我的新脚手架工作。但是脚手架不需要rails服务器启动。

不工作的东西:

现在假设我需要一个设计创业板,我更新本地崇高文本的Gemfile,然后运行

docker-compose run --rm app bundle install

这将按预期安装新的创业板。但当我跑

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添加devise之后,我必须再次运行docker-compose build,这将花费很长的时间,因为bundle install将从零开始安装所有所需的gems。

因此,我可以更新Gemfile而不必重新构建停靠-撰写?

或者我哪里错了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-28 19:06:05

首先,关于docker exec的解决方案。修改容器状态不是一种很好的方法。如果您需要再运行一个app容器实例呢?不会有任何变化的执行。您必须再次在那里安装gems,或者重建映像。当您需要运行多个容器时,这种情况并不少见。例如,您使用docker-compose up运行dev环境,在近终端上使用docker-compose run --rm web bash在第二个应用程序容器中运行shell,并使用它来运行测试、迁移、生成器或使用rails console而不停止docker启动的容器。

关于解决方案。运行docker-compose run --rm app bundle install时,创建新容器,在其中安装新的gems (此操作更新Gemfile.lock,并看到此更改,因为您的项目dir被挂载到容器中)并退出。容器由于--rm标志而被移除。容器中所做的更改不会影响图像。

为了避免在每次gem安装上进行图像重建,您可以添加一个服务来存储gem。下面是基于来自docker-compose.yml的修改后的文档

代码语言:javascript
复制
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:

当您使用为所有应用程序容器存储宝石的容器时,您根本不需要重新生成图像,因为在您运行删除所有容器的docker-compose down之前,或者在您自己删除bundle_cache容器之前,您根本不需要添加新的gems。当然,您不需要对要安装新gems的每个容器使用bundle exec。所以这既简单又省时。

但是,这需要在初始bundle install之后追加docker-compose build,因为在创建并首次将/bundle_cache挂载到带有应用程序的容器时,它将为空。但在此之后,您的宝石将存储在单独的容器中,并且此存储将可用于每个已启动的应用程序容器。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49032151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档