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