首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >捆绑安装和纱线安装中的入口脚本-码头

捆绑安装和纱线安装中的入口脚本-码头
EN

Stack Overflow用户
提问于 2020-04-18 07:49:13
回答 2查看 1.3K关注 0票数 0

我看到bundle installyarn install通常在Dockerfile中完成,如下所示:

代码语言:javascript
运行
复制
RUN bundle install && yarn install

这意味着,如果我修改Gemfile或yarn.lock,我需要重新构建图像。我知道有层缓存,除了bundle安装和纱线安装层之外,停靠程序构建不会重建其他层。但这意味着我必须做docker-compose up -d --build

但我想知道,是否可以将这些命令放在docker-compose或命令的条目脚本中,如:

代码语言:javascript
运行
复制
command: bundle install && yarn install && rails s

通过这种方式,我相信,无论何时,docker-compose up -dbundle installyarn install都将被执行,而不必构建映像。

不确定它是否比Dockerfile中的常规包安装有任何优势,只是不需要在docker-compose up中追加docker-compose up。正确的是,如果我这样做,捆绑安装和纱线安装将被执行,即使没有更改的Gemfile或yarn文件。我想这是不好的一面。

如果这不是理想的方法,请纠正我。

新来的对接世界。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-18 10:47:31

它浪费了几分钟的时间,每次启动应用程序都会耗尽网络带宽。在进行本地开发时,这相当于每次运行应用程序时都要这样做:

代码语言:javascript
运行
复制
rm -rf vendor node_modules
bundle install              # from scratch
yarn install                # from scratch
bundle exec rails s

Docker的核心部分是重建图像(就像Go、Java、类型记录等语言有一个“构建”阶段一样)。试图避免图像重建通常是不可取的。对于编写良好的Dockerfile,特别是对于解释语言,运行docker build应该是相当有效的。

一个重要的技巧是分别复制指定依赖项的文件和应用程序的其余部分。一旦Dockerfile COPY指令遇到一个已更改的文件,它将禁用应用程序其余部分的层缓存。由于依赖项更改的频率相对较低,如果依赖文件没有更改,那么先复制依赖文件,然后安装依赖项,然后复制应用程序的序列可以直接跳转到最后一步。

代码语言:javascript
运行
复制
COPY Gemfile Gemfile.lock ./
RUN bundle install

COPY package.json yarn.lock ./
RUN yarn install

COPY . ./

(确保将邦德勒vendor目录和node_modules目录包含在.dockerignore文件中,以便最后一个COPY步骤不会覆盖以前安装的内容。)

票数 1
EN

Stack Overflow用户

发布于 2020-04-18 09:53:57

这个问题是基于意见的。正如您自己已经发现的,在映像构建过程中安装依赖项(包、纱、其他)是一种常见的做法,而不是图像运行过程。

其基本原理是,您run的次数比build多,并且您希望运行操作能够快速启动。

就像在构建阶段执行apt install...yum install...一样,通常也应该在构建阶段执行bundle install

也就是说,如果bundle install作为入口点的一部分对您有意义的话,那就是您的选择。我怀疑在你做完这件事之后,你会发现它不那么常见是有原因的。

关于停靠层的另一个注意事项:如果Gemfile更改,不仅引用它的层会改变,而且所有后续的层也会改变。因此,通常将依赖项清单(Gemfile.*)的副本与应用程序的复制分开,如下所示:

代码语言:javascript
运行
复制
# Pre-install gems
COPY Gemfile* ./
RUN gem install bundler && \
    bundle install --jobs=3 --retry=3 

# Copy the rest of the app
COPY . .

这样,如果您的应用程序文件更改,而不是依赖项,构建将更快。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61285832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档