为什么要将Gemfile.lock复制到Docker中,然后立即覆盖它?

时间:2018-04-29 04:32:17

标签: ruby-on-rails docker bundler

为什么要复制Gemfile.lock,运行bundle install来创建新的Gemfile.lock,然后立即复制包含原始Gemfile.lock的当前目录并覆盖{{1}刚刚在Docker容器中由Bundler创建的?

另外,为什么你可以逃脱没有Gemfile.lock

https://docs.docker.com/compose/rails/#define-the-project

EXPOSE 3000

这不是它唯一能做到的地方。它也在这里完成,看起来很正式。也许我错过了Docker的一个基本方面?

https://hub.docker.com/_/ruby/

FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

2 个答案:

答案 0 :(得分:1)

更多猜测而不是答案,但有时您在Dockerfile s中略微改编步骤以改进缓存机制。当您更改应用程序中的内容时,它不太可能影响Gemfile,因此您不必在更改所有内容后执行bundle install。以这种方式排序这些步骤可以避免必须执行bundle install更改应用程序而不影响Gemfile

有关构建缓存的文档:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#build-cache

答案 1 :(得分:0)

关于该问题的第二部分:

为什么还不用EXPOSE 3000就能脱身?

您引用的完整Dockerfile确实包含以下行:

EXPOSE 3000