目录

busybox和busybox镜像是什么

概述

很多人用 busybox,但是不是很多人能说出来 busybox 是个什么东西。

探究

用过 busybox 镜像的同学都知道,busybox 没有 curl,另很多习惯用 curl 的同学会有点不习惯,然后会找各种 yum, apt-get, apk 等这些常见的 Linux 发行版的软件包管理工具会安装,但是最终都是徒劳的…因为 busybox 里压根就没有这些,唯一能做的,可能就是不用 curl,该用 wget 好了。

这样自然大家都会有疑问,为什么会没有 curl,又为什么装不了,本文就简单的给大家做个介绍。

关于 busybox 的概念和项目,可以参考一下下面的链接,这里不赘述了,简单来说 busybox 并不是一个常见的 Linux 发行版,而是一个工具集,这里的工具集,理解成很多用C写的命令和工具就好了,所以十分精简,busybox 也许可以覆盖各位工作中90%的工作,但是依然有10%的地方,他无法直接覆盖。而我们经常在 Dockerhub 下载的 busybox 镜像则是由 Docker 社区维护的,也就是一般来说 busybox 镜像不会改也不会加什么命令,一般直接对接的就是 busybox 本身,当然有兴趣的话,可以看看 busybox 的命令源码

举个例子 wget 的实现:

https://git.busybox.net/busybox/tree/networking/wget.c?h=1_32_stable

另外,busybox 的镜像有几种不同的版本,如果你希望有一些包管理工具,也就是当你需要 curl 的时候能安装到,那最好选下带 -musl, -glibc 这些标签之类的镜像,因为有些镜像 是直接 FROM scratch 的,也就是这种镜像就不会有包管理工具,这里一定要心中有数。

镜像探索

执行下面的命令,可以通过 skopeo 将镜像下载到本地,然后我们再抽丝剥茧,具体看看 busybox 的结构。

1
skopeo sync --src docker --dest dir busybox:latest /tmp/busybox/ --tls-verify=false --override-os linux --override-arch amd64
/busybox%E5%92%8Cbusybox%E9%95%9C%E5%83%8F%E6%98%AF%E4%BB%80%E4%B9%88/img.png

在下载的文件夹下,通过 tree 命令查看镜像层,如果了解 image-spec 的话,也就容器的 OCI 标准中关于镜像结构的标准,下面的目录层次是非常清楚了。

1
2
3
4
5
6
7
8
9
>/tmp/busybox # tree
.
└── busybox:latest
    ├── 65ad0d468eb1c558bf7f4e64e790f586e9eda649ee9f130cd0e835b292bbc5ac
    ├── ec562eabd705d25bfea8c8d79e4610775e375524af00552fe871d3338261563c
    ├── manifest.json
    └── version

2 directories, 4 files

查看 manifest.json 文件,虽然说下面有两个 sha256 名称的文件,但是可以看到,其中一个是 config 文件,并且是 json 格式的,说明我们通过 cat 就能直接查看了。另外就是一个 tar 文件,通过 tar xvf 命令,同样可以把其结构解压出来。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
>/tmp/busybox # cat busybox:latest/manifest.json
{
	"schemaVersion": 2,
	"mediaType": "application/vnd.oci.image.manifest.v1+json",
	"config": {
		"mediaType": "application/vnd.oci.image.config.v1+json",
		"digest": "sha256:65ad0d468eb1c558bf7f4e64e790f586e9eda649ee9f130cd0e835b292bbc5ac",
		"size": 372
	},
	"layers": [
		{
			"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
			"digest": "sha256:ec562eabd705d25bfea8c8d79e4610775e375524af00552fe871d3338261563c",
			"size": 2152663
		}
	],
	"annotations": {
		"org.opencontainers.image.url": "https://github.com/docker-library/busybox",
		"org.opencontainers.image.version": "1.36.1-glibc"
	}
}

先看看 65ad0d468eb1c558bf7f4e64e790f586e9eda649ee9f130cd0e835b292bbc5ac 文件,从结果上看,其实就是一些配置相关的信息。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
>/tmp/busybox # cat 65ad0d468eb1c558bf7f4e64e790f586e9eda649ee9f130cd0e835b292bbc5ac
{
	"config": {
		"Cmd": [
			"sh"
		]
	},
	"created": "2023-05-18T22:34:17Z",
	"history": [
		{
			"created": "2023-05-18T22:34:17Z",
			"created_by": "BusyBox 1.36.1 (glibc), Debian 12"
		}
	],
	"rootfs": {
		"type": "layers",
		"diff_ids": [
			"sha256:d51af96cf93e225825efd484ea457f867cb2b967f7415b9a3b7e65a2f803838a"
		]
	},
	"architecture": "amd64",
	"os": "linux"
}

然后再解压文件 ec562eabd705d25bfea8c8d79e4610775e375524af00552fe871d3338261563c,因为文件数太多了,所以只节选一部分内容,可以看到里面大部分都是 rootfs 的内容了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
  ll
total 4232
-rw-r--r--    1 runzhliu  wheel   372B  8 15 21:13 65ad0d468eb1c558bf7f4e64e790f586e9eda649ee9f130cd0e835b292bbc5ac
drwxr-xr-x  407 runzhliu  wheel    13K  5 19  2023 bin
drwxr-xr-x    2 runzhliu  wheel    64B  5 19  2023 dev
-rw-r--r--    1 runzhliu  wheel   2.1M  8 15 21:13 ec562eabd705d25bfea8c8d79e4610775e375524af00552fe871d3338261563c
drwxr-xr-x    8 runzhliu  wheel   256B  5 19  2023 etc
drwxr-xr-x    2 runzhliu  wheel    64B  5 19  2023 home
drwxr-xr-x   11 runzhliu  wheel   352B  5 19  2023 lib
lrwxr-xr-x    1 runzhliu  wheel     3B  5 19  2023 lib64 -> lib
-rw-r--r--    1 runzhliu  wheel   610B  8 15 21:13 manifest.json
drwx------    2 runzhliu  wheel    64B  5 19  2023 root
drwxr-xr-x    2 runzhliu  wheel    64B  5 19  2023 tmp
drwxr-xr-x    4 runzhliu  wheel   128B  5 19  2023 usr
drwxr-xr-x    4 runzhliu  wheel   128B  5 19  2023 var
-rw-r--r--    1 runzhliu  wheel    33B  8 15 21:13 version

总结

我们都知道 busybox 镜像很小,但是我们如果要深入了解容器镜像的概念,就需要了解为什么 busybox 镜像这么小。这就是因为 busybox 镜像包含了容器运行最基础的 rootfs,并且提供了一些工具,没有太多的其他内容了。

参考资料

  1. busybox镜像
  2. busybox
  3. github busybox