首页 > 解决方案 > 在入口脚本中捆绑安装和纱线安装 - Docker

问题描述

我看到了bundle installyarn 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 -dbundle installyarn install无需构建图像。

不确定它是否比 Dockerfile 中的传统捆绑安装有任何优势,除了不必附加--build. docker-compose up更正一下,如果我这样做,即使 Gemfile 或 Yarn 文件没有更改,也会执行 bundle install 和 yarn install。我想这是不好的一面。

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

码头工人世界的新手。

标签: ruby-on-railsdockerdocker-compose

解决方案


这个问题是基于意见的。正如您已经发现的那样,在镜像构建过程中安装依赖项(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 . .

所以这样,如果你的应用文件改变了,但依赖项没有改变,构建会更快。


推荐阅读