当BUNDLE_PATH使用Docker更改时,Bundler找不到已安装的gem

jQw*_*rdy 7 ruby-on-rails docker dockerfile docker-compose

我正在使用docker来开发rails应用程序.docker文件如下所示:

FROM ruby:1.9.3

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev vim

ENV APP_HOME /next-reg
RUN mkdir $APP_HOME
WORKDIR $APP_HOME

ENV BUNDLE_PATH /box

ADD . $APP_HOME

RUN gem install gem1.gem  gem2.gem

COPY Gemfile Gemfile
COPY Gemfile.lock Gemfile.lock

RUN  bundle install
Run Code Online (Sandbox Code Playgroud)

正如你所看到我改变了bundle_path,这是因为有一篇文章展示了我们如何坚持下载宝石.因此,当docker缓存变热时加班,它会重新捆绑并取消FOREVER.

当我docker build成功安装宝石时,它无法在捆绑上找到它们.有人可以给我一个持久的宝石,安装我自己的宝石,让它工作?

在我改变BUNDLE_PATH构建工作之前,它只是经常捆绑而不更改gem文件(因为,我想Docker图像缓存变热了).

我的docker-compose是这样的:

db:
  image: postgres
  volumes:
    - ~/.docker-voumes/postgres/data:/var/lib/postgresql/data
# This is to hold and persist ruby gems, referenced in web and in web's dockerfile.
gem_files:
  image: busybox
  volumes:
    - /box

web:
  build: .
  command: bundle exec rails s -p 3000 -b '0.0.0.0'
  volumes:
    - .:/next-reg
  volumes_from: 
    - gem_files
  ports:
    - "3000:3000"
    - "8000:8000"
  links:
    - db
  env_file:
    - .myenv.env
Run Code Online (Sandbox Code Playgroud)

Jul*_*SIN 10

我认为您的代码中缺少GEM_HOME/GEM_PATH

GEM_HOME/GEM_PATH将被 gem install xxx 用于在特定文件夹中安装 gem。 BUNDLE_PATH将被bundle install用来在特定文件夹中安装gems,但不会被gem install xx使用

要拥有一个有效的系统,你应该这样做:

FROM ruby:1.9.3

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev vim
ENV APP_HOME /next-reg
RUN mkdir $APP_HOME
WORKDIR $APP_HOME

ENV BUNDLE_PATH /box
ENV GEM_PATH /box
ENV GEM_HOME /box

ADD . $APP_HOME

RUN gem install bundler
RUN gem install tzinfo -v 1.2.2

COPY Gemfile Gemfile

RUN  bundle install
Run Code Online (Sandbox Code Playgroud)

有了这个 Gemfile :

source 'https://rubygems.org'

gem 'tzinfo', '1.2.2'
Run Code Online (Sandbox Code Playgroud)

它将产生:

步骤 11/13:运行 gem install tzinfo -v 1.2.2
 ---> 在 8a87fa54fa19 中运行
成功安装thread_safe-0.3.6
成功安装tzinfo-1.2.2
安装了 2 个宝石
 ---> 3c91d59bde8a
卸下中间容器 8a87fa54fa19

步骤 13/13:运行捆绑安装
 ---> 在 20f1e4ec93b1 中运行
不要以 root 身份运行 Bundler。如果需要,Bundler 可以请求 sudo,并且
以 root 身份安装捆绑包将会破坏所有非 root 的应用程序
这台机器上的用户。
正在从 https://rubygems.org/ 获取 gem 元数据...
从 https://rubygems.org/ 获取版本元数据。
解决依赖关系...
Rubygems 1.8.23.2 不是线程安全的,因此您的 gems 将一次安装一个。升级到 Rubygems 2.1.0 或更高版本以启用并行 gem 安装。
安装耙子12.0.0
使用thread_safe 0.3.6
使用捆绑器 1.14.6
使用tzinfo 1.2.2
捆绑完毕!2 个 Gemfile 依赖项,现已安装 4 个 gem。
捆绑的 gem 安装到 /box 中。

正如您在结果输出中看到的,bundle install重新使用了预加载的 gemgem install