繁体   English   中英

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

[英]Adding project folder except for Dockerfile

我试图在docker容器中运行一个小的Rails应用程序。 我越来越近,但我正在努力使用我的Dockerfile。

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

ADD .

在此之后,我跑了

RUN bundle install --deployment

但是,因为我的ADD命令还添加了Dockerfile,这意味着每次编辑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镜像缓存?

您对@Kuhess答案的评论澄清,说实际问题是“docker图像缓存失效导致bundle install再次运行”,这有助于为您提供答案。

我一直在使用我的rails 4.1。* app的Dockerfile,如下所示。 通过首先添加Gemfile *,然后运行bundle install,然后仅添加应用程序的其余部分,将缓存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 install的映像缓存中断,因为它们是在RUN之后添加的。 唯一打破它的是对Gemfile *的更改,这是正确的。

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

.git
log
vendor/bundle

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

您的主要问题是由于ADDDockerfile的修改而导致缓存被Dockerfile 其中一位维护者解释说,目前, .dockerignore文件并不是为处理它而设计的:

它 - .dockerignore - 当您将上下文从客户端上传到守护进程时跳过一些文件,并且守护进程需要Dockerfile来构建映像。 所以.dockerignore的主要想法(现在)正在跳过大型目录以加快上传速度,而不是干净的上下文。 对Github的全面评论

我担心当您ADD Dockerfile时图像缓存会中断,而这些行未被修改。

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

.
├── Dockerfile
└── files_to_add/

然后,如果你ADD files_to_add ,将不包括Dockerfile并且不会驱逐缓存。

但是,我不认为这个技巧是一个解决方案。 我还希望将Dockerfile放在项目根目录下的其他文件旁边。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM