使用这些实用工具确保 Docker 镜像的质量
由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!
当我们谈到软件测试时,大多数时候都是在测试应用程序代码,以确保其安全性符合我们定义的代码质量指标和功能/业务要求。
单元测试或集成测试等概念同样适用于基础设施相关的代码。
测试虚拟机和裸机系统可能非常复杂,而且非常耗时耗力,但使用容器则要容易得多。
接下来,我将介绍一些可以用来确保 Docker 镜像质量的工具。
哈多林特
Hadolint是一个 Dockerfile 代码检查工具。
它可以用来确保你的 Dockerfile 不包含结构错误,并遵循官方最佳实践。
它还在底层使用了ShellCheck ,这是一个 shell 脚本的静态分析工具,用于验证 Dockerfile“RUN”指令中存在的 shell 代码,这非常方便。
编写一个完善的 Dockerfile 是创建高质量镜像的第一步。
容器结构测试
容器结构测试是谷歌开发的一种用于验证镜像结构的工具。它可以被视为容器的单元测试框架。
这些测试可用于检查映像中命令的输出,以及验证文件系统的元数据和内容。
您可以在 YAML 文件中定义测试,然后针对本地现有镜像或某个镜像仓库运行该工具。
一个简单的元数据测试,用于检查环境变量、标签、端口等是否存在,可以定义如下:
metadataTest:
env:
- key: foo
value: baz
labels:
- key: 'com.example.vendor'
value: 'ACME Incorporated'
exposedPorts: ["8080", "2345"]
volumes: ["/test"]
entrypoint: []
cmd: ["/bin/bash"]
workdir: "/app"
Goss 和 DGoss
Goss是另一个基于 YAML 的服务器配置验证工具。它使用 Go 语言编写,可用于测试从虚拟机到容器的各种系统。Dgoss是一个封装库,方便用户在容器环境中使用 Goss。
以下是一个使用 Goss 进行测试定义的示例:
port:
tcp:22:
listening: true
ip:
- 0.0.0.0
tcp6:22:
listening: true
ip:
- '::'
service:
sshd:
enabled: true
running: true
user:
sshd:
exists: true
uid: 74
gid: 74
groups:
- sshd
home: /var/empty/sshd
shell: /sbin/nologin
group:
sshd:
exists: true
gid: 74
process:
sshd:
running: true
如你所见,它真的很容易理解。
它与“容器结构测试”非常相似,但提供了更丰富的功能,可以验证服务、用户、包、组,甚至 HTTP 端点等内容。虽然您也可以使用“容器结构测试”编写自己的命令来实现这些功能,但 goss 已经提供了开箱即用的功能。
我觉得两者都是不错的选择。我还没实际用过Goss。你可以试试看更喜欢哪个 ;)
厨房 CI
Kitchen CI是测试基础设施代码的常用工具之一。
Kitchen 提供了一个测试框架,可以在一个或多个平台上隔离地执行基础架构代码。
驱动程序插件架构用于在各种云提供商和虚拟化技术(例如 Vagrant、Amazon EC2 和 Docker)上运行代码。
它支持许多测试框架,例如InSpec或Serverspec。
它基于 Ruby,比 Goss 或 Structure Test 要复杂得多,也需要更多的依赖项。尽管如此,它仍然是一个非常强大的工具,值得您了解一下。
使用 Clair 进行安全测试
在使用容器时,安全性是一个经常被忽视但非常重要的方面。Docker 镜像底层仍然运行着像 Ubuntu 或 Alpine 这样的操作系统,其中可能包含存在已知安全漏洞的软件包,这些漏洞需要被监控和修复。
Clair是一个开源项目,可以帮助你找到 Docker 镜像中的这些漏洞。
它包含一个定期更新的数据库,以便能够找到最新发现的问题。
您可以轻松地将其集成到您的 CI 流水线中,以便在出现任何漏洞时收到通知。
最近我还发现了Anchore,它与 Anchore 非常相似,但除了开源解决方案外,它还提供带有仪表盘和其他功能的企业解决方案。
使用 Dive 控制图像大小
拥有体积小且经过优化的图片对于加快构建速度至关重要。
Dive是一个非常酷的工具,它允许你探索 Docker 镜像,查看其各层的内容等等。
了解图像图层的组织方式,并找到缩小最终图像尺寸的方法,会很有帮助。
更酷的是,你可以在 CI 系统上运行它,并配置它根据与图像大小相关的一些指标来使构建失败。
结论
除了应用程序代码之外,测试基础设施代码对于避免出现意外问题也至关重要。
在较为传统的系统中,这并不总是容易的,而且在时间和资源方面可能会付出很高的代价。
借助 Docker 和这些工具,可以非常简单快捷地实现一些基本测试,以确保所需的软件包已安装、指定的端口正在监听以及所需的服务正在运行。
这些测试可以让你更有信心,确保整个系统能够按预期运行。
你还知道哪些我文章里没提到的好用工具吗?欢迎分享。
感谢阅读。
文章来源:https://dev.to/brpaz/ensure-the-quality-of-your-docker-images-with-these-cool-tools-1bh7