添加除Dockerfile之外的项目文件夹

我正在尝试在Docker容器中运行一个小的Rails应用程序。 我越来越接近,但我正在努力与我的Dockerfile。

我已经添加了以下命令到我的Dockerfilerecursion添加我的项目文件夹中的所有文件。

ADD . 

之后,我跑了

 RUN bundle install --deployment 

但是,因为我的ADD命令还添加了Dockerfile,这意味着我的图像caching每次编辑Dockerfile时都会中断,迫使我重新绑定。

根据https://docs.docker.com/reference/builder/#the-dockerignore-file ,我可以使用.dockerignore文件来忽略Dockerfile,但是这会导致docker docker build命令失败

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

我如何轻松地将我的项目添加到我的图像,但排除Dockerfile,所以我不打破docker图像caching?

您在对@Kuhess的回答发表评论时说,实际的问题是“docker映像caching失效导致bundle安装再次运行”,这有助于为您提供答案。

我一直在使用Dockerfile,看起来像下面的我的Rails 4.1。*应用程序。 通过首先添加Gemfile *,然后运行软件包安装,然后添加应用程序的其余部分,软件包安装步骤将被caching,除非其中一个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位于应用程序的根目录中,但对其进行更改(或应用程序的任何其他部分)不会导致捆绑安装的映像caching因为它们在运行后添加而中断。 唯一破坏它的是对Gemfile *的更改,这是正确的。

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

 .git log vendor/bundle 

在Github上有一个问题: https : //github.com/docker/docker/issues/7969

您的主要问题是由于ADD和修改Dockerfile而导致高速caching被驱逐。 其中一位维护者解释说,目前, .dockerignore文件并不是为了处理它而devise的:

它 – .dockerignore – 当你将上下文从客户端上传到守护进程并且守护进程需要用于构build映像的Dockerfile时,跳过一些文件。 所以.dockerignore的主要思想(现在)正在跳过大的目标,以加快上下文的上传,而不是干净的上下文。 对Github的完整评论

恐怕在ADD Dockerfile时,图像caching会中断,而这些行不会被修改。

也许处理caching的一种方法是将所有要添加的文件放在与Dockerfile不同的目录中:

 . ├── Dockerfile └── files_to_add/ 

那么,如果你ADD files_to_addDockerfile将不会被包含,caching也不会被驱逐。

但是,我不认为这个技巧是一个解决scheme。 我也想要我的Dockerfile旁边的其他文件在我的项目的根目录。