简介
在本次实验中,你将学习如何使用 docker inspect
命令快速了解 Docker 镜像。你将探索如何获取特定镜像的详细信息,识别并检查最近构建的镜像,以及了解如何使用格式化选项从检查输出中提取相关数据。本实验将通过使用示例镜像和一个简单的 Dockerfile 引导你完成实际示例。
在本次实验中,你将学习如何使用 docker inspect
命令快速了解 Docker 镜像。你将探索如何获取特定镜像的详细信息,识别并检查最近构建的镜像,以及了解如何使用格式化选项从检查输出中提取相关数据。本实验将通过使用示例镜像和一个简单的 Dockerfile 引导你完成实际示例。
在这一步中,你将学习如何使用 docker inspect
命令快速了解特定的 Docker 镜像。该命令可提供有关 Docker 对象(包括镜像、容器、卷和网络)的详细信息。
首先,让我们拉取一个可以检查的示例镜像。我们将使用 hello-world
镜像,这是一个用于测试的非常小的镜像。
docker pull hello-world
你应该会看到表明镜像正在被拉取和下载的输出。
现在我们已经有了这个镜像,就可以使用 docker inspect
来获取有关它的信息。
docker inspect hello-world
这个命令将输出一个大型的 JSON 对象,其中包含有关 hello-world
镜像的各种详细信息,例如其 ID、创建日期、架构、操作系统和配置。
为了快速了解情况,你可能会对这个 JSON 输出中的特定字段感兴趣。你可以在 docker inspect
中使用 -f
或 --format
标志来指定一个 Go 模板,以格式化输出。例如,要查看镜像 ID 和创建日期,你可以使用以下命令:
docker inspect -f '{{.Id}} {{.Created}}' hello-world
这个命令将输出镜像 ID 及其创建时间戳。{{.Id}}
和 {{.Created}}
是占位符,它们引用 docker inspect
的 JSON 输出中的 Id
和 Created
字段。
你可以从完整的 docker inspect hello-world
命令的 JSON 输出中探索其他字段,并在你的格式字符串中使用它们,以获取你需要的特定信息。
在这一步中,你将学习如何识别并快速了解最近构建的 Docker 镜像。当你正在积极开发和构建镜像,并希望快速检查最新版本时,这非常有用。
首先,让我们创建一个简单的 Dockerfile 来构建一个镜像。在你的 ~/project
目录中,创建一个名为 Dockerfile
的文件,内容如下:
FROM alpine:latest
RUN echo "Hello, Docker!" > /app/message.txt
CMD cat /app/message.txt
这个 Dockerfile 使用 alpine
基础镜像,添加一个名为 message.txt
的文件,内容为 "Hello, Docker!",并设置容器运行时打印该文件内容的命令。
现在,使用 docker build
命令构建 Docker 镜像。我们将其标记为 my-recent-image
。
docker build -t my-recent-image .
命令末尾的 .
表示 Dockerfile 位于当前目录(~/project
)。你将看到显示构建过程的输出。
构建完成后,你可以使用 docker images
列出你的镜像。
docker images
你应该会看到 my-recent-image
被列出,以及上一步中的 hello-world
镜像和 alpine
基础镜像。最近构建的镜像通常会出现在列表顶部,或者具有最近的创建时间。
要快速了解最近构建的镜像,你可以将 docker images
与 head
和 awk
等命令行工具结合使用,以提取列表中第一个镜像的 ID(通常是最近的镜像)。然后,你可以使用该 ID 运行 docker inspect
。
docker inspect $(docker images -q | head -n 1)
让我们来分解这个命令:
docker images -q
:仅列出镜像 ID。head -n 1
:获取输出的第一行,即最近镜像的 ID。$(...)
:这是命令替换,它执行括号内的命令,并将其输出替换到外部命令中。docker inspect ...
:使用从命令替换中获得的 ID 检查镜像。这将输出最近构建的镜像的详细 JSON 信息。你可以再次在 docker inspect
中使用 -f
标志,根据需要格式化输出,与上一步类似。
例如,要查看最近镜像的 ID 和创建日期:
docker inspect -f '{{.Id}} {{.Created}}' $(docker images -q | head -n 1)
这提供了一种快速获取你刚刚构建的镜像关键信息的方法。
在这一步中,你将学习如何通过生成和检查 SPDX(软件包数据交换,Software Package Data Exchange)文件,快速了解 Docker 镜像中的软件组件。SPDX 是一种用于传达软件物料清单(SBOM,Software Bill of Materials)信息的开放标准,这些信息包括组件、许可证和版权等。
为 Docker 镜像生成 SPDX 文件需要一个能够分析镜像层并提取必要信息的工具。syft
就是这样一个工具,它是一个用于从容器镜像和文件系统生成 SBOM 的命令行工具。
由于 syft
没有预先安装,我们将下载并安装它。我们将下载适用于 Linux 的最新版本。
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sudo bash -s -- -b /usr/local/bin
这个命令会下载 syft
的安装脚本,并使用 sudo
执行该脚本,将二进制文件安装到 /usr/local/bin
目录。你可能会被要求输入密码,但 labex
用户可以免密码使用 sudo
。
安装完成后,你可以通过检查其版本来验证 syft
是否安装成功:
syft version
你应该会看到 syft
的版本信息。
现在,让我们为上一步中构建的 my-recent-image
生成一个 SPDX 文件。我们将把结果输出到 ~/project
目录下一个名为 my-recent-image.spdx.json
的文件中。
syft my-recent-image -o spdx-json > ~/project/my-recent-image.spdx.json
这个命令指示 syft
分析 my-recent-image
,并以 SPDX JSON 格式输出结果,然后将输出重定向到指定的文件。根据镜像的大小,这个过程可能需要一些时间。
命令执行完成后,你将得到一个 SPDX JSON 文件,其中包含镜像中发现的软件包的详细清单。你可以使用像 nano
这样的文本编辑器查看该文件的内容:
nano ~/project/my-recent-image.spdx.json
在文件中,你会找到关于镜像本身的信息以及检测到的软件包列表,包括它们的名称、版本和许可证。这让你无需运行容器或手动检查各个镜像层,就能快速了解镜像中存在的软件组件。
你可以滚动浏览文件,查看不同的部分及其包含的信息。查找 packages
数组,它列出了检测到的软件组件。
按 Ctrl + X
退出 nano
。
在本次实验中,你学习了如何使用 docker inspect
命令快速了解 Docker 镜像。你通过拉取 hello-world
镜像并使用 docker inspect
以 JSON 格式查看其详细信息,练习了对特定镜像的检查。你还学习了如何在 docker inspect
中使用 -f
标志和 Go 模板来提取和格式化特定字段,如镜像 ID 和创建日期,从而实现自定义的快速概览。
此外,你探索了如何识别和检查最近构建的 Docker 镜像,这在积极的开发周期中特别有用。这包括了解如何列出镜像,并可能对其进行过滤或排序,以找到最新的镜像进行检查。