首页 > 解决方案 > 使用多个 FROM 语句改进我的 Dockerfile 构建时间

问题描述

是否可以让我的 docker 构建速度更快。

我已经看到带有多个 FROM 语句的 Dockerfile,这对我的 Dockerfile 有意义吗?

FROM ruby:2.5-alpine

RUN apk update && apk --update add \
 build-base \
 nodejs \
 postgresql-dev \
 tzdata \
 imagemagick \
 ruby-dev \
 libxml2-dev \
 libxslt-dev \
 pcre-dev \
 libffi-dev  

# yarn
ENV PATH=/root/.yarn/bin:$PATH
RUN apk add --virtual build-yarn curl && \
    touch ~/.bashrc && \
    curl -o- -L https://yarnpkg.com/install.sh | sh && \
    apk del build-yarn

# app
RUN mkdir /app
WORKDIR /app

COPY Gemfile ./
RUN gem install bundler -v 2.0.1
RUN gem uninstall bundler --version '<2.0.0'
RUN gem install nokogiri -v '1.10.1' --source 'https://rubygems.org/'
RUN bundle install --binstubs

我正在使用谷歌云构建和注册表,所以我可以存储一个中间 docker 映像并将其与它的注册表一起存储。

标签: dockerdockerfilegoogle-cloud-build

解决方案


Docker多阶段构建有助于减少最终映像的大小,但不会减少构建时间。


真正减少构建时间的是了解 Docker 构建缓存如何在后台工作。从编写 Dockerfiles文档的 Docker最佳实践中阅读利用构建缓存。

我不熟悉 Ruby,但在我看来,Gemfile它只对bundle install命令有用,而对命令被忽略gem install。如果是这种情况,你最好移动这COPY Gemfile ./条线,让它出现在RUN bundle install --binstubs. 原因是每次您的 Gemfile 更改时,docker build都会识别这种情况,并使构建缓存中该指令之后的任何层失效。


现在我之前所说的一切都是有效的,只要你在同一台机器上运行连续的构建。

由于您使用的是 Google Cloud Build,因此您每次都将在新的干净环境中运行每个构建,因此,缓存中不会有任何 docker 中间层......除非您配置 Google Cloud Build 来保存和恢复缓存。

从加速构建文档的Google Cloud Build最佳实践中,您将找到有关如何启用Kaniko缓存的说明,该缓存将负责保存这些 docker build 中间层。


推荐阅读