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

Why would you copy your Gemfile.lock into Docker, then immediately overwrite it?

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

还有,为什么你没有 EXPOSE 3000 就可以逃脱?

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

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

这不是它唯一这样做的地方。它也是在这里完成的,这看起来很官方。也许我遗漏了 Docker?

的一个基本方面

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

COPY Gemfile Gemfile.lock ./
RUN bundle install

COPY . .

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

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

关于本题的第二部分:

Also why can you get away with not having EXPOSE 3000?

您引用的完整 Dockerfile 包含此行:

EXPOSE 3000