介绍container-diff工具


谷歌容器团队发布了container-diff工具,用来恢复容器镜像之间的不同,帮助我们更加方便地进行容器应用开发。因为这是一个对开发基于容器的应用很有用的工具,所以很高兴将它开源给开发社区。

容器采用Dockefile格式使客制化应用运行环境变的更加方便和易于理解。这是容器对软件开发带来的优点,而其主要的缺点则在于很难将Dockerfile对镜像的改变可视化,因为镜像变得越来越臃肿,所以排查比较困难。

设想一个开发者正在基于第三方维护的镜像之上开发应用,另外一个人发布了此镜像的新版本基础包。开发者采用了新镜像并重建了应用,突然应用无响应了,因为依赖于以前基础镜像中的系统包,但是因为没有可用工具判断这两个基础镜像之间的不同,因此无法确定到底依赖哪个系统包以及哪个版本,这会严重影响开发进度。

介绍container-diff

container-diff帮助用户了解镜像之间的差别。意味着container-diff从了解底层数据改变开始,然后通知包管理者并以一种可读的方式将信息传递给用户;它可以发现镜像内系统包、语言包和文件的变化。

container-diff帮助用户察觉镜像之间语法的不同,也就意味着container-diff监控底层变化,然后通过可读的方式输出这种变化。

用户可以用几种格式访问镜像--包括本地Docker守护进程( 使用daemon://前缀 ),远程注册表( 使用remote://前缀 ),或者用'docker save'命令输出的tar文件。也可以将这几种格式整合起来发现本地镜像版本和远程版本之间的不同,这对于还没准备发布的镜像尤为重要。container-diff内置支持镜像tar包和远程注册协议,使得它可以在无Docker守护进程环境下运行。

实例和使用场景

此例子是一个在Debian基础包内部安装Python的Dockerfile。在它们之间运行container-diff,用户可以看到所有Python依赖的apt包。
usercase_1.png

下图是接续上面那个安装了Python的基础镜像,然后在其中安装mock和其它六个包。用户可以同时使用container-diff和pip differ,看到所有安装或者被改变的Python包:
usercase_2.png

以上功能对于管理Python包的依赖模块以及改变非常有用。

这些只是一部分例子。此工具现在支持通过pip和npm安装的Python和Node.js包,同时支持镜像文件系统和Docker历史的比较。未来,谷歌还会添加其他运行环境和不同语言的支持,包括Java,Go和Ruby。外部贡献也是非常欢迎的,如果想对container-diff作出贡献,可以看how-to指南

现在我们已经看到如何比较两个镜像,很容易设想此工具如何被整合到大型开发工作流中,例如:
  • 生成更改日志:考虑到container-diff可以帮助用户发现文件系统和包的更改,因此可以被用到自动生成新镜像的更改日志。
  • 持续整合:作为CI系统一部分,用户可以使用container-diff发现使用Dockerfile带来的文件系统级别的改变。


container-diff默认输出模式是“用户可读的”,但是也支持JSON格式,允许用户自动分析和处理。

单一镜像分析

除了可以用于比较镜像间不同,container-diff还可以用于分析镜像内部。用户可以迅速获得一个镜像内部信息,例如系统和语言包以及文件系统内容。

咱们再看看Debian基础镜像,可以很容易使用此工具发现安装过的包,以及他们的版本和大小:
usercase_3.png

我们可以用这个功能发现应用的兼容性,或者排序系统包的大小,查看哪个占用了更大的空间。

更多信息和实例,可以查看GitHub上的文档。

特别感谢我们的实习软件工程师Colette Torres和Abby Tisdale, 他们帮忙编译了这个工具。

原文链接:Introducing container-diff, a tool for quickly comparing container images(翻译:杨峰)

0 个评论

要回复文章请先登录注册