ruby-on-rails - 在入口脚本中捆绑安装和纱线安装 - Docker
问题描述
我看到了bundle install
,yarn install
通常在 Dockerfile 中完成如下:
RUN bundle install && yarn install
这意味着如果我修改 Gemfile 或 yarn.lock,我需要重新构建镜像。我知道有层缓存,docker build 不会重建除 bundle install && yarn install 层之外的其他层。但这意味着我必须做docker-compose up -d --build
但我想知道是否可以将这些命令放在 docker-compose 的入口脚本或命令中:
command: bundle install && yarn install && rails s
这样,我相信,无论何时,我都会执行docker-compose up -d
,bundle install
而yarn install
无需构建图像。
不确定它是否比 Dockerfile 中的传统捆绑安装有任何优势,除了不必附加--build
. docker-compose up
更正一下,如果我这样做,即使 Gemfile 或 Yarn 文件没有更改,也会执行 bundle install 和 yarn install。我想这是不好的一面。
如果这不是理想的方式,请纠正我。
码头工人世界的新手。
解决方案
这个问题是基于意见的。正如您已经发现的那样,在镜像构建过程中安装依赖项(bundle、yarn、其他)是一种常见的做法,而不是在镜像运行过程中。
理由是你run
的次数比你多build
,并且你希望运行操作快速启动。
与您在构建阶段执行的方式相同,您通常也应该在构建阶段执行apt install...
此操作。yum install...
bundle install
bundle install
也就是说,如果作为入口点的一部分对您有意义,那是您的选择。我怀疑在你这样做之后,你会发现它不那么常见是有原因的。
关于 docker 层的另一个注意事项:如果 Gemfile 发生变化,不仅引用它的层会发生变化,而且所有后续层也会发生变化。出于这个原因,通常将依赖项清单 ( Gemfile.*
) 的副本与应用程序的副本分开,如下所示:
# Pre-install gems
COPY Gemfile* ./
RUN gem install bundler && \
bundle install --jobs=3 --retry=3
# Copy the rest of the app
COPY . .
所以这样,如果你的应用文件改变了,但依赖项没有改变,构建会更快。
推荐阅读
- ember.js - 如何在 ember 模板中按 ID 查找对象
- php - 在 Woocommerce 中更改已购买产品的“添加到购物车”按钮
- linux - 如何使用 BIND9 设置比特币或山寨币 DNS 种子?
- css - Invariant Violation:文本字符串必须在 Text 组件中呈现
- javascript - 固定位置 div,如果 div 在屏幕上,则切换到相对位置
- html - 使用套接字构建实时 API
- c++ - 当我尝试定义这个 vector< pair< int 时,pair
> > vp(n) - python - 单步执行 Python 3 中的生成器(例如,代表国际象棋游戏)
- jquery - 滚动时我的导航栏出现问题(我的导航栏中的文本是透明的)
- sql - oracle,从字符串中提取多个子字符串