我在使用busybox图像时有些疑惑

I have some doubts when using the busybox image

我使用sudo docker pull busybox:latest下载busybox镜像。而且是 1.2MB。

我使用sudo docker inspect busybox:latest 来查找数据目录。这是 /var/lib/docker/overlay2/0ca30bdc9f5eacfcc7838b165fd811d39c883b4859b256765b55c2e0b3b1710f.

使用 du -sh /var/lib/docker/overlay2/0ca30bdc9f5eacfcc7838b165fd811d39c883b4859b256765b55c2e0b3b1710f,显示 1.3MB。但是当我进入/var/lib/docker/overlay2/0ca30bdc9f5eacfcc7838b165fd811d39c883b4859b256765b55c2e0b3b1710f/diff/bin时,我发现有很多可执行文件。它们每个占用 1.1MB。总计 432MB。

为什么du -sh不计算这些文件的大小?

当我cp/var/lib/docker/overlay2/0ca30bdc9f5eacfcc7838b165fd811d39c883b4859b256765b55c2e0b3b1710f到其他目录。 du -sh 在新目录中确实计算了这些文件。我很困惑。

感谢您的帮助。

它们都是同一个文件,因此 du(1) 不会对它们进行多重计数。 (这是 the POSIX spec 所要求的。)如果您在目录上 运行 ls -i,您将看到这一点:那里的每个命令都有相同的编号,其中该编号唯一标识实际的底层命令磁盘上的文件。

Busybox 的工作方式是,有一个二进制文件提供所有内置命令,当它启动时,它会查看启动时的名称来决定要做什么。 ln(1) 命令将默认为现有文件创建硬 link 或备用名称:

# copy a to b1; if you delete a then b1 is still intact
cp a b1
# b has the name of a; if you delete a then b2 is "dangling"
ln -s a b2
# b3 is a; if you delete a then b3 is fine; if you change a you change b3 too
ln a b

ls -li

所以shcpbusybox实际上都是相同的(紧凑的)文件,这就是为什么Docker 基于 Busybox 的映像(或可启动媒体)太小了。