Ruby on rails 添加Dockerfile以外的项目文件夹
我正在尝试在docker容器中运行一个小Rails应用程序。我越来越接近了,但是我正在努力处理我的Dockerfile文件 我已将以下命令添加到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
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
文件似乎还不可能。一名维护人员解释了问题的原因。此外,还定义了您得到的错误。所以目前,我担心这是不可能的。我刚刚修改了答案,将重点放在缓存逐出问题上。