热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我应该最小化泊坞窗层的数量吗?

如何解决《我应该最小化泊坞窗层的数量吗?》经验,为你挑选了3个好方法。

该文档没有详细说明该主题.它说:

最小化层数

在Docker 17.05之前,甚至更多,在Docker 1.10之前,最小化图像中的层数非常重要.以下改进减轻了这种需求:

在Docker 1.10及更高版本中,只有RUN,COPY和ADD指令可以创建图层.其他指令创建临时中间图像,不再直接增加构建的大小.

Docker 17.05及更高版本增加了对多阶段构建的支持,允许您仅将所需的工件复制到最终图像中.这允许您在中间构建阶段中包含工具和调试信息,而不会增加最终图像的大小.

看起来最新的Docker版本无法解决处理多个层的问题.他们宁愿努力减少最终图像中的数量.最重要的是,文档并没有说明为什么很多层都不好.

我知道42层的AUFS限制.对于广泛使用的图像来说保持较小的层数是有意义的,因为它有助于构建在其上的其他图像符合限制.但是,还有其他存储驱动程序和图像用于其他目的.

保持图像较小也是一个明显的原因 - 它们占用磁盘空间和网络带宽.但是,我不认为链接RUN语句并因此将多个层压缩为一个有助于一般.如果不同的RUN更新文件系统的不同部分,则一层和多层的大小应该大致相同.

另一方面,许多层允许更快地使用缓存和重建图像.它们也是平行拉动的.

我在一个拥有私有Docker注册表的小团队中工作.我们永远不会满足42层限制,主要关注性能和开发速度.

如果是这样,我应该最小化泊坞窗层的数量吗?



1> VonC..:

我在一个拥有私有Docker注册表的小团队中工作.我们永远不会满足42层限制,主要关注性能和开发速度.

如果是这样,我应该最小化泊坞窗层的数量吗?

在你的情况下,没有.
需要最小化的是构建时间,这意味着:

确保最常用的步骤,最长的步骤,然后缓存,允许你在快速重建时间的同时摆弄Dockerfile的最后几行(最具体的命令).

确保最长的RUN命令首先出现在它们自己的层中(再次被缓存),而不是与其他RUN命令链接:如果其中一个失败,则必须重新执行long命令.如果该长命令在其自己的(Dockerfile行)/层中被隔离,则它将被缓存.


话虽这么说,你提到的文档来自于docker/docker.github.io,正是PR 4992和PR 4854,一个后docker build LABEL段.
因此,本节介绍了类似的注释LABEL,并强调创建图层的命令.
再次,在您的情况下,这不重要.



2> Stefano..:

我只是想看看2个图像的区别是什么,一个是用多个RUN构建的,另一个是用一个RUN连接命令构建的.

在第一种情况下,图像正在进行简单的操作(创建和删除文件).

"单个"图层图像的内容:

FROM busybox

RUN echo This is the 1 > 1 \
    && rm -f 1 \
    && echo This is the 2 > 2 \
    && rm -f 2 \
# ... for about 70 commands

多层图像的内容:

FROM busybox

RUN echo This is the 1 > 1
RUN rm -f 1
RUN echo This is the 2 > 2
RUN rm -f 2
# ... for about 70 layers

构建时间非常不同(多个:0m34,973s,单数:0m0,568s).容器启动时间也不同但不太明显(多个:0m0,435s,单数:0m0,378s).我运行的图像时间不同,但时间并没有那么大.

关于这个空间,我看了多层情况下最坏情况的目的,正如预期的那样,多层图像比单层更大.

在另一个测试中,我连接了仅向图像添加内容的图层.构建时间与前一种情况相比没有变化,但运行时情况显示略有不同:多层图像的启动速度比单层图像快.关于空间,同样的结果.

我不认为这证明了什么,但我很乐意这样做:P



3> BMitch..:

减少层数本身就不是目标.相反,您需要关注的是减少构建时间并减少图像大小.

通过保留Dockerfile顶部或基本映像中很少更改的公共层来减少构建时间.这允许在以后的构建中缓存和重用该层.这不是关于减少层数,而是关于更好地排序层.

减小映像大小有助于减少注册表服务器上的磁盘使用量,这会在为CI系统上的每个构建存储映像时对磁盘造成大量影响.它还减少了传输图像的网络时间.如果您有一个下载大型临时文件的图层并将其删除到另一个图层中,则会导致该文件保留在第一层,通过网络发送并存储在磁盘上,即使它在内部不可见你的容器.更改文件的权限还会导致使用新权限将文件复制到当前层,从而使该文件的磁盘空间和网络带宽加倍.

在上述场景中减小图像大小的标准解决方案是链接RUN命令,以便临时文件永远不会存储到图像层.这具有减少图像层数量的副作用.

还有最后一个问题,即过度缓存.这在Debian图像中的apt-get updateapt-get install ...命令中很常见.如果不将这些命令链接在一起,则对apt-get install命令的更新将重用前一层apt-get update命令中可能过时的缓存,并且在几个月后找不到所需的包时将失败.因此,您应该链接这些命令,即使它会增加构建时间,因为另一个选项是将来会出现构建失败.

因此,减少所需的层的副作用更多,不一定是为了减少层而减少层数.


推荐阅读
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
author-avatar
手机用户2502907057
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有