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

Chl*_*loe 8 ruby-on-rails bundler docker

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

还有为什么你可以摆脱没有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
Run Code Online (Sandbox Code Playgroud)

这不是唯一这样做的地方。它也在这里完成,这似乎很官方。也许我错过了 Docker 的一个基本方面?

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

COPY Gemfile Gemfile.lock ./
RUN bundle install

COPY . .
Run Code Online (Sandbox Code Playgroud)

sne*_*eep 5

更多的是猜测而不是答案,但有时您对Dockerfiles 中的步骤的顺序略有不同,以改进缓存机制。当您更改应用程序中的内容时,影响 s 的可能性较小Gemfile,因此您不必bundle install在更改所有内容后执行 a 操作。以这种方式对步骤进行排序可以避免必须执行bundle install不影响 s 的应用程序更改Gemfile

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


hma*_*mak 1

关于这个问题的第二部分:

另外,为什么没有 EXPOSE 3000 就可以逃脱惩罚呢?

您引用的完整内容Dockerfile确实包含这一行:

EXPOSE 3000