我正在尝试为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:
答案 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
。对我来说是工作