懵了,构建一个 Docker 镜像花 60 分钟?如何提高效率?

789489dd3b90af8fe5403acaf34f04aa.gif

作者 | Andy

来源 | 进击云原生

最近,有一个需求:向镜像构建管道添加一个参数,以允许用户在构建时配置超时时间。

我们计划在构建时配置 10 分钟的默认超时,并且允许用户覆盖此配置,因为他们的某些镜像构建需要长达 60 分钟才能完成。而且每天都在进行多次构建。

为了便于阅读,我删除了一些内容,Dockerfile 看起来像这样:

FROM ubuntu:focal-20210119
RUN apt-get -y update && \apt-get -y upgrade && \apt-get install -y --no-install-recommends \dos2unix \jq \libpython3.10 \python3-pip \software-properties-common \tar \unzip \wget \zip && \echo "Cleaning up" && \rm -rf /var/lib/apt/lists/* && \apt-get clean
RUN pip3 install boto3 flaskRUN echo "Installing AWS CLIv2" && \TMPDIR=$(mktemp -d) && \wget -P $TMPDIR --no-check-certificate "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" && \unzip $TMPDIR/awscli-exe-linux-x86_64.zip -d $TMPDIR && \$TMPDIR/aws/install && \rm -rf /usr/local/aws-cli/v2/dist/awscli/examples/ && \rm -rf $TMPDIR
RUN echo "Installing kubectl" && \wget -P /usr/bin/ --no-check-certificate https://storage.googleapis.com/kubernetes-release/release/$(wget --no-check-certificate -O -    https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && \chmod +x /usr/bin/kubectl
# Install the app
COPY dummyapp.py /app/

rebuild 的重点是应用程序更改,而不是对底层依赖项的更改。

由于 Dockerfile 已被精简,现在大约 5 分钟内构建完成。但讲真,这时间仍然很长,因为通常可能只要几秒钟。

这是我构建的部分输出:

# time docker build --no-cache --progress=plain -t test:test .
Sending build context to Docker daemon  3.072kB
Step 1/5 : FROM ubuntu:focal-20210119---> f63181f19b2f
Step 2/5 : RUN apt-get -y update &&     apt-get -y upgrade &&     apt-get install -y --no-install-recommends         dos2unix         jq         libpython3.10         python3-pip         software-properties-common         tar         unzip         wget         zip &&     echo "Cleaning up" &&     rm -rf /var/lib/apt/lists/* &&     apt-get clean---> Running in 37bff266446e
Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]
Get:2 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [1470 kB]
<snip>
45400K .......... .......... .......... .......... .......... 99% 2.31M 0s45450K .......... .......... .......... .......... ......    100% 8.05M=18s
2022-01-28 19:37:06 (2.40 MB/s) - '/usr/bin/kubectl' saved [46587904/46587904]
Removing intermediate container 86223b438cef---> b8f9a2cc1d9a
Step 6/6 : COPY dummyapp.py /app/---> b95d22cdca6f
Successfully built b95d22cdca6f
Successfully tagged test:test
real    5m11.679s
user    0m1.248s
sys     0m1.961s

怎样才能让这个构建更快?

每次构建这个 Dockerfile 时,都会重复很多处理,其结果不太可能经常改变。

  • 更新 ubuntu 软件包列表

  • 升级 ubuntu 软件包

  • 安装一些额外的软件包

  • 使用 pip3 安装一些 python 包

  • 安装 AWS CLI

  • 安装 kubectl

  • 安装应用程序

还 FROM 一个相当旧的 Ubuntu 版本,需要升级更多的包,因此升级步骤将花费更长的时间。

此镜像的大多数重新 build 的目的是合并应用程序更改(即仅 Dockerfile 中的最后一行)。因此,最明显的变化是将此 Dockerfile 拆分为 2 个(或更多)Dockerfile,并且将 FROM 语句更改为使用最新的 Ubuntu 基础镜像。

第一个 Dockerfile 看起来像这样:

FROM ubuntu:latest
RUN apt-get -y update && \apt-get -y upgrade && \apt-get install -y --no-install-recommends \dos2unix \jq \libpython3.10 \python3-pip \software-properties-common \tar \unzip \wget \zip && \echo "Cleaning up" && \rm -rf /var/lib/apt/lists/* && \apt-get clean
RUN pip3 install boto3 flaskRUN echo "Installing AWS CLIv2" && \TMPDIR=$(mktemp -d) && \wget -P $TMPDIR --no-check-certificate "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" && \unzip $TMPDIR/awscli-exe-linux-x86_64.zip -d $TMPDIR && \$TMPDIR/aws/install && \rm -rf /usr/local/aws-cli/v2/dist/awscli/examples/ && \rm -rf $TMPDIR
RUN echo "Installing kubectl" && \wget -P /usr/bin/ --no-check-certificate https://storage.googleapis.com/kubernetes-release/release/$(wget --no-check-certificate -O -    https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && \chmod +x /usr/bin/kubectl

第二个 Dockerfile 可能看起来像这样:

FROM dummyapp-dependencies:latest
# Install the app
COPY dummyapp.py /app/

构建第一个 Dockerfile 并没有为我们节省任何时间,虽然需要大约 5 分钟,但只需要相对不频繁地构建第一个 Dockerfile。

然而,构建第二个 Dockerfile 的效果要好得多,只需要大约 2 秒:

# time docker build --no-cache --progress=plain -t tes
t:test -f Dockerfile.app .
Sending build context to Docker daemon   5.12kB
Step 1/2 : FROM dummyapp:1.0.0
pull access denied for dummyapp, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
real    0m2.125s
user    0m0.043s
sys     0m0.030s

鉴于应用程序的更改比底层依赖项更频繁,刚刚节省了大量时间。

775bde6f647542d7b941e2ca42d8bb7a.gif

往期推荐

如何跨 Namespace 同步 Secret 和 ConfigMap?

掘地三尺搞定 Redis 与 MySQL 数据一致性问题

Redis 内存满了怎么办?这样置才正确!

云淘金时代,安全为王!

f0b0382b4d9c24ab3bac334a268237fa.gif

点分享

9fb389763b0ee35bc892c9e57a8825ea.gif

点收藏

d5d4b820db59222e7d514e8032d6c6d3.gif

点点赞

fb5837033725214232369e6ee9456c9e.gif

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java实现短信上行源码_Java 发送短信验证码 示例源码

【实例简介】执行前请先设置修改 src/test.java 文件//用户名private static String Uid "uid";//接口安全秘钥(不是登录密码)private static String Key "key";//手机号码&#xff0c;多个号码如13800000000,13800000001,13800000002private static Str…

Android项目架构设计深入浅出

简介&#xff1a;本文结合个人在架构设计上的思考和理解&#xff0c;介绍如何从0到1设计一个大型Android项目架构。 作者 | 璞珂 来源 | 阿里技术公众号 前言&#xff1a;本文结合个人在架构设计上的思考和理解&#xff0c;介绍如何从0到1设计一个大型Android项目架构。 一 引…

技术实践第四期|解读移动开发者日常-性能监控平台应用

简介&#xff1a;应用性能监控平台是用来帮助客户提升应用性能质量和稳定性的重要环节&#xff0c;本人作为一名移动端开发者有着丰富的使用和运维经验&#xff0c;希望通过本文分享过往的心得和使用经验&#xff0c;让我参与开发的U-APM这款产品中&#xff0c;作为借鉴可以在中…

彻底理解操作系统:CPU与实模式

作者 | 陆小风来源 | 码农的荒岛求生‍对于人类来说&#xff0c;我们不喜欢拐弯抹角&#xff0c;喜欢更直接的东西&#xff0c;“有话直说”、“没有中间商赚差价”、“简洁的设计”等等&#xff0c;然而对于计算机&#xff0c;尤其是对内存管理来说则恰恰相反&#xff0c;在这…

边缘计算的 4 种类型都有哪些?

作者 | Addo Zhang来源 | 云原生指北本篇文章译自 SUNKU RANGANATH 的 4 Types of Edge Computing - Broadly Categorized。文章通过 往返终端设备和数据中心的延迟 来对边缘计算的类型进行大致的分类&#xff0c;通俗易懂&#xff0c;方便大家对边缘计算有个大概的了解。边缘计…

OpenKruise v1.0:云原生应用自动化达到新的高峰

简介&#xff1a;OpenKruise 是针对 Kubernetes 的增强能力套件&#xff0c;聚焦于云原生应用的部署、升级、运维、稳定性防护等领域。 云原生应用自动化管理套件、CNCF Sandbox 项目 -- OpenKruise&#xff0c;近期发布了 v1.0 大版本。 OpenKruise[1] 是针对 Kubernetes 的…

Serverless Kubernetes 落地实践

简介&#xff1a;如何通过原生 Kubernetes 提供 Serverless 能力&#xff1f;如何借力丰富的云原生社区生态&#xff1f;本文将给大家介绍一下我们在 Serverless Kubernetes 上的落地实践。 作者&#xff1a;元毅 导读 Kubernetes 作为当今云原生业界标准&#xff0c;具备良…

如何在零停机的情况下迁移 Kubernetes 集群

简介&#xff1a;本文将通过集群迁移的需求、场景以及实践方式&#xff0c;介绍如何基于阿里云容器服务 ACK&#xff0c;在零停机的情况下迁移 Kubernetes 集群。 作者&#xff1a;顾静&#xff08;子白&#xff09;&#xff5c;阿里云高级研发工程师&#xff1b;谢瑶瑶&#…

轻松理解 Docker 网络虚拟化基础之 veth 设备!

作者 | 张彦飞allen来源 | 开发内功修炼最近我又对网络虚拟化技术产生了浓厚的兴趣&#xff0c;迫切想搞明白在 Docker 等虚拟技术下&#xff0c;网络底层是如何运行的。不得不说&#xff0c;网络虚拟化技术是我给自己抛的又一个大坑。虽然我自认为把原生 Linux 网络实现过程理…

如何做好数字化体验管理,了解一下?

简介&#xff1a;本文主要分为三部分&#xff0c;第一部分是数字化体验的必要性&#xff0c;从数字化体验管理对业务的影响和数字化体验管理对企业的价值两个方面来介绍其必要性&#xff1b;第二部分&#xff0c;ARMS 在数字化体验管理上的产品能力介绍&#xff1b;第三部分&am…

深信服智能边缘计算平台与 OpenYurt 落地方案探索与实践

简介&#xff1a;本文将介绍边缘计算落地的机遇与挑战&#xff0c;以及边缘容器开源项目 OpenYurt 在企业生产环境下的实践方案。 作者&#xff1a;赵震&#xff0c;深信服云计算开发工程师&#xff0c;OpenYurt 社区 Member 编者案&#xff1a;在 5G、物联网等新技术的持续推…

云原生的本手、妙手和俗手

作者 | 步尔斯特来源 | 步尔斯特刚刚看到一个话题&#xff1a;Java大军&#xff0c;真的开始把目光从Spring Cloud转向云原生系的k8s Istio了么&#xff1f;乍一看&#xff0c;有一丝不解&#xff0c;Java大军&#xff1f;Spring Cloud&#xff1f;Kubernetes&#xff1f;Serv…

云原生背景下故障演练体系建设的思考与实践—云原生混沌工程系列之指南篇

简介&#xff1a;生产环境的突袭演练是我们迈出的艰难但有力的一步&#xff0c;锻炼了研发运维人员的应急响应能力&#xff0c;在真实用户场景下锤炼系统&#xff0c;推进了产品的轮班制度&#xff0c;提升了云原生底座的稳定性和竞争力。 作者&#xff1a;智妍&#xff08;郑…

Spring Boot Serverless 实战系列“部署篇” | Mall 应用

简介&#xff1a;本篇中为各位讲述如何将 Mall 应用部署到函数计算平台上。为了让分析更有代表性&#xff0c;我选择了 Github 上 star 数超过 50k 的电商应用 mall 作为示例。 作者&#xff1a;西流 导读&#xff1a;Spring Boot 是基于 Java Spring 框架的套件&#xff0c;它…

押宝云原生,Ampere Computing打响服务器芯片变革关键一枪

“闯龙潭&#xff0c;越虎穴”这句话用来形容在服务器领域披荆斩棘的Arm架构服务器器芯片似乎最为合适不过。所谓“龙潭”“虎穴”指的便是雄霸服务器芯片市场数载的intel与AMD&#xff0c;而他们所属的x86架构&#xff0c;更是数据中心芯片领域的绝对主流。然而云原生时代的到…

阿里云实时数仓Hologres年度发布,解读数仓新趋势

简介&#xff1a;阿里云实时数仓Hologres年度发布&#xff0c;解读数仓新趋势。 1月7日&#xff0c;阿里云实时数仓Hologres发布最新版本&#xff0c;在成本、可用性、在线高可用等多方面进行了能力升级&#xff0c;行存吞吐提升100%&#xff0c;列存吞吐提升30%&#xff0c;支…

服务发现与配置管理高可用实践

简介&#xff1a;本篇是微服务高可用最佳实践系列分享的开篇&#xff0c;系列内容持续更新中&#xff0c;期待大家的关注。 作者&#xff1a;三辰&#xff5c;阿里云云原生微服务基础架构团队技术专家&#xff0c;负责 MSE 引擎高可用架构 本篇是微服务高可用最佳实践系列分享…

联想首次详解混合云Lenovo xCloud五大优势,如何打造智能化数字底座

多年积累之后&#xff0c;联想混合云品牌Lenovo xCloud主打云原生、智能运维、私有云、多云管理4大产品家族&#xff0c;9款通用解决方案&#xff0c;覆盖客户“建云、上云、用云和管云”的全部场景 6月10日&#xff0c;联想举办“弹性韧性悟性——多云混合时代Lenovo xCloud提…

阿里云何川:开放兼容的云,计算巢帮助合作伙伴云化升级

简介&#xff1a;保障业务稳定性&#xff0c;提供安全的云上互联网&#xff0c;助力合作伙伴实现规模化&#xff0c;打通多渠道分发。 12月21日&#xff0c;在阿里云弹性计算年度峰会上&#xff0c;阿里云弹性计算高级产品专家何川发表了题为《开放兼容的云&#xff0c;计算巢…

只用两个自定义 Hooks 就能替代 React-Redux ?

作者 | &#x1f47d;来源 | 前端Sharing前言之前有朋友问我&#xff0c;React Hooks 能否解决 React 项目状态管理的问题。这个问题让我思索了很久&#xff0c;最后得出的结论是&#xff1a;能&#xff0c;不过需要两个自定义 hooks 去实现。那么具体如何实现的呢&#xff1f;…