,我将首先解释什么在起作用:
我使用这个医生的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而不必重新构建停靠-撰写?
或者我哪里错了?
发布于 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的修改后的文档。
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挂载到带有应用程序的容器时,它将为空。但在此之后,您的宝石将存储在单独的容器中,并且此存储将可用于每个已启动的应用程序容器。
https://stackoverflow.com/questions/49032151
复制相似问题