alpine docker镜像和busybox docker镜像之间有什么区别?
当我查看它们的dockerfile时,alpine的dockerfile如下(适用于Alpine v3.12 - 3.12.7)
FROM scratch
ADD alpine-minirootfs-3.12.7-x86_64.tar.gz /
CMD ["/bin/sh"]
FROM scratch
ADD busybox.tar.xz /
CMD ["sh"]
但正如https://alpinelinux.org/about/所述:
Alpine Linux是围绕musl libc和busybox构建的。
那么这两者有什么区别呢?
我也很好奇为什么许多docker镜像(例如nodejs/nginx/php)提供基于alpine而不是busybox的镜像。为什么会这样?那么busybox镜像的用例是什么呢?请注意,我不是在寻求关于为什么A比B更好或反之的答案,也不需要软件推荐。
正如musl-libc - Alpine's Greatest Weakness和Does Alpine have known DNS issue within Kubernetes?所述,我一直在经历alpine docker的间歇性DNS查找失败。这就是我提出这个问题的原因之一。
PS,https://musl.libc.org/说"musl是在Linux系统调用API之上构建的C标准库的实现",而https://en.wikipedia.org/wiki/Alpine_Linux则提到:
以前它使用uClibc作为其C标准库,而不是通常使用的传统GNU C库(glibc)。尽管它更轻量级,但它确实有一个显著的缺点,即与glibc不兼容。因此,所有软件必须编译为使用uClibc才能正常工作。截至2014年4月9日,Alpine Linux切换到了musl,它与glibc部分二进制兼容。
busybox
镜像使用的是哪个 libc 库?我们需要分析busybox.tar.xz
文件才能知道。 - Charles Duffybusybox.tar.xz
是如何构建的才能回答这个问题。 - Charles DuffypkgsMusl.busybox
,你就会得到一个动态编译的针对musl libc的busybox;告诉它你想要pkgsStatic.busybox
,你就会得到一个静态编译的针对musl libc的busybox;而只有pkgs.busybox
是针对glibc编译的busybox。而且,通过使用dockerTools
,您可以告诉Nix将其中任何一个制作成Docker镜像。 - Charles DuffypkgsStatic
和pkgsMusl
只是代码 -- 它们并没有做任何你不能在几行代码中自己编写的事情,所以如果你想要 glibc-and-static,那就相对容易(“相对”是因为 glibc 通过dlopen()
加载存根解析器来执行 DNS,这也是忙碌的盒子镜像不再是 glibc-and-static 的原因)。 - Charles Duffy