为什么要复制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
答案 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