Ruby on rails 添加Dockerfile以外的项目文件夹

Ruby on rails 添加Dockerfile以外的项目文件夹,ruby-on-rails,docker,Ruby On Rails,Docker,我正在尝试在docker容器中运行一个小Rails应用程序。我越来越接近了,但是我正在努力处理我的Dockerfile文件 我已将以下命令添加到Dockerfile中,以递归方式添加项目文件夹中的所有文件 ADD . 在这之后,我跑步 RUN bundle install --deployment 但是,由于我的ADD命令也会添加Dockerfile,这意味着每次编辑Dockerfile时,图像缓存都会中断,迫使我重新处理 根据,我可以使用.dockerginore文件忽略Dockerfil

我正在尝试在docker容器中运行一个小Rails应用程序。我越来越接近了,但是我正在努力处理我的Dockerfile文件

我已将以下命令添加到Dockerfile中,以递归方式添加项目文件夹中的所有文件

ADD .
在这之后,我跑步

RUN bundle install --deployment
但是,由于我的
ADD
命令也会添加Dockerfile,这意味着每次编辑Dockerfile时,图像缓存都会中断,迫使我重新处理

根据,我可以使用
.dockerginore
文件忽略Dockerfile,但这会导致
docker build
命令失败

2014/09/17 22:12:46 Dockerfile was excluded by .dockerignore pattern 'Dockerfile'

如何轻松地将项目添加到映像中,但排除docker文件,这样就不会破坏docker映像缓存?

Github上有一个问题:

您的主要问题是由于
ADD
Dockerfile
的修改而导致缓存被逐出。一位维护人员解释说,目前,
.dockrignore
文件不是用来处理它的:

It-.dockerginore-当您将上下文从客户端上载到守护程序时,会跳过一些文件,守护程序需要Dockerfile来构建映像。所以,.dockrignore的主要思想(目前)是跳过大目录以更快地上传上下文,而不是干净的上下文

当您在未修改的情况下添加Dockerfile时,恐怕图像缓存会中断

处理缓存的一种方法可能是将所有要添加的文件放在与
Dockerfile
不同的目录中:

.
├── Dockerfile
└── files_to_add/
然后,如果将文件添加到添加中,则不会包括
Dockerfile
,缓存也不会被逐出


但是,我不认为这个把戏是个解决办法。我还希望将我的
Dockerfile
放在我的项目根目录下的其他文件旁边。

您在@Kuhess对答案的评论中所作的澄清,指出实际问题是“docker映像缓存失效导致捆绑包安装再次运行”,这有助于为您提供答案

我一直在为我的rails 4.1.*应用程序使用一个Dockerfile,如下所示。通过先添加Gemfile*,然后运行bundle安装,然后再添加应用程序的其余部分,bundle安装步骤将被缓存,除非其中一个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位于应用程序的根目录中,但对它(或应用程序的任何其他部分)所做的更改不会导致bundle安装的映像缓存中断,因为它们是在运行后添加的。唯一破坏它的是对Gemfile*的更改,这是正确的

仅供参考,我的.dockrignore文件如下所示:

.git
log
vendor/bundle

这里的实际问题不是文件的存在,而是docker映像缓存的失效导致bundle安装再次运行。这正是我试图避免加速事情的原因。是的,我理解你的观点(事实上我也面临同样的问题)。但是,使用
.dockrignore
文件似乎还不可能。一名维护人员解释了问题的原因。此外,还定义了您得到的错误。所以目前,我担心这是不可能的。我刚刚修改了答案,将重点放在缓存逐出问题上。