Docker:$ PATH

时间:2017-04-27 18:53:42

标签: ruby-on-rails docker docker-compose

我正在尝试为Rails创建一个docker文件,它允许容器处理所有需求,例如Ruby版本。我有一个Rails项目,它有Gemfile和Gemfile.lock,其中只定义了Rails(5.0.0.1)。我的Dockerfile和Compose文件如下。除了使用标准方法来启动新项目之外,我还希望缓存gems以加速开发。为此,似乎我需要将bundle install移动到Compose文件。但是现在,如果我尝试生成Rails应用程序,我会在$ PATH中找到错误的rails可执行文件:

docker-compose run web rails new . --force --database-postgresl --skip-bundle

解决此问题需要做什么?当我正在使用现有的项目方案来缓存gems时,将二进制文件添加到PATH似乎解决了这种情况下的问题,但不确定从头开始处理事情。

#ENV HOME=/usr/src/app PATH=/usr/src/app/bin:$PATH

Dockerfile

FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev 
nodejs

RUN mkdir /docknewdev22C
WORKDIR /docknewdev22C

ADD Gemfile /docknewdev22C
ADD Gemfile.lock /docknewdev22C

ENV BUNDLE_PATH /gems

#add the app's binaries path to $PATH:
ENV HOME=/docknewdev22C PATH=/docknewdev22C/bin:$PATH

#RUN bundle install (NOW IN COMPOSE FILE)
ADD . /docknewdev22C

多克尔-COMPOSE.yml

version: '2.1'
services:
   db:
   image: postgres
   volumes:
     - postgres-data:/var/lib/postgresql/data
web:
  build: .
  #added bash command as server.pid was persisting so multiple runs would 
  complain about existing server.
  command: bash -c "bundle install && rm -f tmp/pids/server.pid && bundle 
  exec rails s -p 3000 -b '0.0.0.0'"

  #mount the folder of the project from the local workstation.
  volumes:
    - .:/docknewdev22C
    - gem_cache:/gems
  ports:
    - "3000:3000"
  depends_on:
    - db

volumes:
  postgres-data:
    driver: local

  gem_cache:

2 个答案:

答案 0 :(得分:0)

试试这个:

<强> Dockerfile

FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev 
nodejs

RUN gem install bundler -v 1.11.2 --no-ri --no-rdoc

RUN mkdir /src
WORKDIR /src

COPY Gemfile Gemfile.lock ./

RUN bundle install

# Copy the main application.
COPY . ./

CMD ./start-dev.sh

<强> start-dev.sh

rm /src/tmp/pids/server.pid
bundle exec rails s -p 3000 -b '0.0.0.0'

这样,只有在想要覆盖的情况下,才需要在docker-compose中使用字段“command”。 dockerfile的每一行都会创建一个图层,其中一行是关于安装gems RUN bundle install所以如果你不更新它之前的行,你将每次都从缓存构建你的图像。

答案 1 :(得分:0)

请使用bundle exec。对我来说是工作