我正在尝试在 docker 容器中运行一个小型 Rails 应用程序。我已经接近了,但是我正在努力处理我的 Dockerfile。
我已将以下命令添加到我的 Dockerfile 以递归地添加我的项目文件夹中的所有文件。
ADD .
在这之后,我运行
RUN bundle install --deployment
但是,因为我的 ADD
命令也添加了 Dockerfile,这意味着每次我编辑 Dockerfile 时我的图像缓存都会中断,迫使我重新捆绑。
根据https://docs.docker.com/reference/builder/#the-dockerignore-file ,我可以使用 .dockerignore
文件来忽略 Dockerfile,但这会导致 docker build
命令失败并显示
2014/09/17 22:12:46 Dockerfile was excluded by .dockerignore pattern 'Dockerfile'
我怎样才能轻松地将我的项目添加到我的镜像中,但排除 Dockerfile,这样我就不会破坏 docker 镜像缓存?
最佳答案
您在对@Kuhess 答案的评论中澄清说,实际问题是“docker 图像缓存失效导致捆绑安装再次运行”,这有助于为您提供答案。
我一直在为我的 rails 4.1.* 应用程序使用如下所示的 Dockerfile。通过首先添加 Gemfile*,然后运行捆绑安装,然后才添加应用程序的其余部分,捆绑安装步骤将被缓存,除非其中一个 Gemfile* 文件发生更改。
FROM ruby:2.1.3
RUN adduser --disabled-password --home=/rails --gecos "" rails
RUN gem install bundler --no-ri --no-rdoc
RUN gem install -f rake --no-ri --no-rdoc
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
RUN chown -R rails:rails /myapp
USER rails
EXPOSE 3000
ENV RAILS_ENV production
CMD bundle exec rails server -p 3000
我的 Dockerfile 位于应用程序的根目录中,但对其(或应用程序的任何其他部分)的更改不会导致用于捆绑安装的图像缓存中断,因为它们是在 RUN 之后添加的。唯一破坏它的是对 Gemfile* 的更改,这是正确的。
仅供引用,我的 .dockerignore 文件如下所示:
.git
log
vendor/bundle
关于ruby-on-rails - 添加除 Dockerfile 之外的项目文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25899541/