【问题标题】:Why would you copy your Gemfile.lock into Docker, then immediately overwrite it?为什么要将 Gemfile.lock 复制到 Docker 中,然后立即覆盖它?
【发布时间】:2018-04-29 04:32:16
【问题描述】:

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

还有为什么你可以不使用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 . .

【问题讨论】:

    标签: ruby-on-rails docker bundler


    【解决方案1】:

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

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

    【讨论】:

    • 我认为这是正确的答案。如果您重建 docker 映像并且 Gemfile 没有更改,则跳过此(冗长的)步骤。
    【解决方案2】:

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

    还有,为什么没有 EXPOSE 3000 可以侥幸逃脱?

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

    EXPOSE 3000

    【讨论】:

    • 当我写这个问题时,文档似乎不完整。那里没有EXPOSE 3000
    • @Chloe 感谢您的回复,有道理。如果您编辑对下一个人来说很棒的原始问题。
    猜你喜欢
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 2017-11-17
    • 2012-11-05
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多