减少Docker映像大小

在构建Docker应用程序时,使图像尽可能轻便会带来很多实际好处。 它使事情变得更快,更轻便且不易中断。 轻巧的图像还使使用Jet,Codeship的Docker CI / CD平台之类的服务变得更加容易; 他们不太可能提出难以解决的复杂问题,并且在构建之间共享它们所需的时间更少。

考虑到这一点,让我们讨论一些简化Docker映像并使它们尽可能小的好方法。 感谢Codeship团队中的每个人以及我们为这些提示做出贡献的朋友!

根据需要使用尽可能少的层

通常,层数越少,Dockerfile就越简单。 这意味着您应该尽可能地组合相关的命令,但是当然不要仅仅为了产生一个很小的图像而尝试组合不相关的命令。 特别是如果您不熟悉Docker。

最好在添加文件时拆分层(以增加粒度和可缓存性),但在运行相关命令时合并层。 例如,运行apt get update && apt-get install以便始终使用最新版本的父命令执行从属命令,并在同一层中完成对命令的所有清理。

有一些工具可以检查Docker映像的组成,以查看哪些层可能导致膨胀。 尝试在MicroBadger上查看图像的图层。

立即清理

运行命令时,请执行最简单的命令链,以使一切正常运行。 另外,正如我前面提到的,请始终尝试在运行原始命令的同一层进行清理。 下载档案,解压缩,然后编辑文件或将其移到适当位置非常普遍,然后忘记随后删除原始档案。

删除这类文件以及其他临时日志和缓存目录可以减少最终映像中的大量空间。 但是,如果您不在同一Dockerfile行中执行此操作,则删除的文件仍将存在于先前的图像层中。 这种类型的清除适用于Docker映像构建期间文件系统上的所有交互。

例如:

RUN wget http://mysite.com/app && tar -xzf app.tar.gz && rm app.tar.gz

代替:

RUN wget http://mysite.com/app
RUN tar -xzf app.tar.gz
RUN rm app.tar.gz

!新的号召性用语

使用精简的基本图片

为您的项目使用适当的基础映像会产生巨大的变化。 在Rails项目中使用正式的Ruby映像很​​有意义,但是如果您只是在容器中执行二进制文件,是否需要完整的Ubuntu映像? 也许您可以使用较小的图像(例如Alpine),甚至只是运行Scratch容器?

一种可能性是仅使用您需要的组件来创建自定义基础映像。 不要害怕拍摄精简的图像,只添加所需的组件。 有时,根据您的需求定制的较小图像比开箱即用的图像更可取。

使用正确的图像提供正确的服务

在任何有意义的地方,继续并在服务之间共享映像。 但是,如果一项服务需要Ruby而不是Rails,而其他所有服务都需要Rails,则可以将它们分开以创建多个上下文简化的图像。

做:

  • 使用现有的相似图像或更复杂的图像时
    • 反正正在建立该图像;
  • 在所有其他情况下,请使用具有最简单基础映像的服务。

不要:

  • 使用更复杂的图像作为构建工件。

优化dockerignore

这可以带来很大的不同:尽可能向.dockerignore

根据您的应用程序,您可能希望至少忽略.gitlogtmp文件夹(尽管在某些情况.git可能需要包括.git )。 您还可以更新管道的其他部分,以避免将大型二进制文件转储到构建上下文中不需要的目录中。 这将防止由于错误将构建工件错误地添加到构建环境中而导致的图像膨胀。

一种帮助确定要删除内容的方法是在覆盖入口点到交互式外壳程序的同时运行映像。 这样,您可以查看所有添加的文件,并记下您实际上不需要的任何文件。

$ docker build -t myapp ./
$ docker run --entrypoint /bin/bash -it myapp
root # ls
mycode tmp logs
^D
$ echo “tmp” >> .dockerignore
$ echo “logs” >> .dockerignore

您可以在正在运行的容器中四处查看,以查看图像是否遗留了不必要的文件。

这种优化的一个很大的副作用是您的图像生成速度更快,因为您的图像层将包含较少的使它们无效的文件。

构建与引导

一个决定会影响您的许多其他选择并对最终结果产生重大影响的决定是将资产构建到映像中还是在运行时准备它们。

尽管您可以在构建时编译资产并将其包含在映像中,但也可以在运行时生成它们。 您甚至可以从外部源中提取它们,这些外部源是在构建过程中,在先前构建过程中或从完全带外过程生成的。 您还可以以压缩格式将资产添加到图像,然后在运行时将其解压缩。

正确的方法取决于您的体系结构和目标,但是您应该考虑最终希望图像有多大或多轻。

结论

如您所见,有很多很棒的方法来减小图像尺寸。 其中一些超越了单纯的效率,并且依赖于会渗透到应用程序架构其余部分的决策。

请记住:高效的图像最终是在尺寸上做出的权衡,要与可靠和轻松地支持应用程序所需的平衡。

翻译自: https://www.javacodegeeks.com/2016/08/reducing-docker-image-size.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值