bundler安装的宝石不会持久存在fig / docker中

时间:2014-06-15 05:28:35

标签: ruby-on-rails docker

我正在尝试使用fig和docker为现有的rails应用程序设置本地开发环境。

在构建过程中,我清楚地看到bundler安装应用程序的gem,但是当我尝试使用fig up启动容器或者甚至使用/ bin / bash命令重新打开它时,gems不可见。< / p>

这是Dockerfile:

FROM ubuntu:14.04

# REPOS
RUN apt-get -qq update
RUN apt-get install -y software-properties-common
RUN add-apt-repository -y "deb http://archive.ubuntu.com/ubuntu $(lsb_release -sc) universe"
RUN add-apt-repository -y ppa:chris-lea/node.js
RUN apt-get -y update

#INSTALL
RUN apt-get install -y -q build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison pkg-config libpq-dev make wget unzip git vim nano nodejs gawk libgdbm-dev libffi-dev

#RUBY
RUN mkdir -p /download 
WORKDIR download
RUN wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.2.tar.gz
RUN tar xvfz ruby-2.1.2.tar.gz

WORKDIR /download/ruby-2.1.2

RUN ./configure 
RUN make
RUN make install
RUN gem update --system
RUN gem install bundler
RUN mkdir /rent
WORKDIR /rent
ADD Gemfile /rent/Gemfile
ADD Gemfile.lock /rent/Gemfile.lock
RUN bundle install --deployment

这是fig.yml文件:

web:
  build: .
  command: bundle exec rails s -p 3000
  volumes:
    - .:/rent
  ports:
    - "3000:3000"

正在运行fig build会清楚地显示正在安装应用的宝石。 正在运行fig up失败并显示消息

  

bundler:找不到命令:rails

如果我运行fig run web /bin/bash并检查

的内容
  

/local/lib/ruby/gems/2.1.0/gems

它只安装了bundler,rdoc,rake和其他一些。

如果我导航到应用程序的目录并运行bundle命令,它将安装应用程序的宝石,我可以看到它们已安装在上面的目录中。我甚至可以使用rails server启动应用。

为什么捆绑的宝石不会保留在图像中(容器?)。

我从无花果网站上跑了轨道tutuorial并没有出现这个问题。

由于

2 个答案:

答案 0 :(得分:1)

似乎问题是由于--deployment使用bundle install标志造成的。

这个标志的主要作用是将gem部署到vendor / bundle /目录而不是普通的gem位置。我检查过,宝石在那里,所以我不确定红宝石为什么找不到它们。

无论如何,删除--deployment解决了问题。

答案 1 :(得分:0)

如果你正在使用fig和已装载的卷,我找到了一个解决方案,它允许在开发过程中更新已挂载的文件(如fig run web bundle install时的Gemfile.lock),同时仍然保持容器缓存行为

查看完整内容:https://gist.github.com/fotinakis/04077671bec4edf77c08

这有点令人费解,但基本上你总是将bundle和gem作为非root应用程序用户安装:

# Add 'web' user which will run the application.
RUN adduser web --home /home/web --shell /bin/bash --disabled-password --gecos ""

# Add directory where all application code will live and own it by the web user.
RUN mkdir /app
RUN chown -R web:web /app

# Install gems separately here to take advantage of container caching of `bundle install`.
# Also, ensure that gems are installed as the web user and not system-wide so that we can run
# `fig web bundle install` and the web user will have permissions to update the shared Gemfile.lock.
ADD Gemfile /app/
ADD Gemfile.lock /app/
RUN chown -R web:web /app
USER web
ENV HOME /home/web
ENV PATH $PATH:/home/web/.gem/ruby/2.1.0/bin
ENV GEM_HOME /home/web/.gem/ruby/2.1.0
ENV GEM_PATH $GEM_HOME
RUN gem install --user-install bundler
WORKDIR /app/
RUN bundle install
USER root

# Add the whole application source to the image and own it all by web:web.
# Note: this is overwritten in development because fig mounts a shared volume at /app.
ADD . /app/
RUN chown -R web:web /app

现在运行此功能并更新您的本地Gemfile.lock:

$ fig run web bundle install