概述
很多人用 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
|
在下载的文件夹下,通过 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,并且提供了一些工具,没有太多的其他内容了。
参考资料
- busybox镜像
- busybox
- github busybox
注意
本文最后更新于 2024年8月15日,文中内容可能已过时,请谨慎参考。