docker - 使用多个 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 映像并将其与它的注册表一起存储。
解决方案
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 中间层。
推荐阅读
- java - 如何从 java 应用程序运行 windows 命令提示符?
- kubernetes - 如何将 PodSecurityPolicy 应用于非 kube-system 命名空间资源?
- java - Spring xml主bean
- javascript - 如何将变量从 node.js 函数传递到 graphql-tag?
- arrays - 将数组元素的基数从八进制更改为十进制(在远程运行的本地 bash 脚本中)
- java - 如何将自定义 restTemplate istance 添加到 RestTemplateEurekaHttpClient
- python - 如何为一系列不同的问题输入 10 次
- android - Android Keystore 崩溃,大多数在三星设备、Android 8 和 8.1 上,在 Android 应用程序启动时
- python - 如何在类中的函数中使用追加和扩展而不在同一个类中明确定义它们?
- c# - Azure 函数:客户 HTTP 路由中的查询参数有问题