Linux alpine docker图像和busybox docker图像有什么区别?

Linux alpine docker图像和busybox docker图像有什么区别?,linux,docker,alpine,busybox,Linux,Docker,Alpine,Busybox,图像和图像的区别是什么 当我检查他们的DockFile时,(对于Alpine v3.12-3.12.7) 但正如我所说 Alpine Linux是围绕musl libc和busybox构建的 那么到底有什么区别呢 我还很好奇,许多docker图像(nodejs/nginx/php仅举几个例子)提供了基于alpine而非busybox的图像。为什么呢那么busybox映像的用例是什么?我需要强调的是,我不是在寻找一个关于为什么A比B好的答案,或者反之亦然,或者软件推荐 正如这里和这里所说,我的a

图像和图像的区别是什么

当我检查他们的DockFile时,(对于Alpine v3.12-3.12.7)

但正如我所说

Alpine Linux是围绕musl libcbusybox构建的

那么到底有什么区别呢

我还很好奇,许多docker图像(nodejs/nginx/php仅举几个例子)提供了基于alpine而非busybox的图像。为什么呢那么busybox映像的用例是什么?我需要强调的是,我不是在寻找一个关于为什么A比B好的答案,或者反之亦然,或者软件推荐

正如这里和这里所说,我的alpine docker遇到了间歇性的DNS查找失败。这是我提出问题的原因之一

PS说,“musl是建立在Linux系统调用API之上的C标准库的实现”,并提到

它以前使用uClibc作为其C标准库,而不是 传统GNUC库(glibc)是最常用的。虽然是 更轻的是,它确实有明显的缺点 二进制与glibc不兼容。因此,必须编译所有软件 与uClibc一起使用以正常工作。截至2014年4月9日,[16]阿尔卑斯山 Linux切换到musl,它与 格里伯


这两者之间的关键区别在于,
busybox
映像的旧版本静态链接busybox与glibc(当前版本由于在静态配置中使用libnss而动态链接busybox与glibc),而
alpine
映像动态链接musl libc

详细讨论用于在这两者之间进行选择的权重因子在这里是不属于主题的(软件推荐请求),但有一些关键点:

将glibc与musl libc进行比较,有几个要点(当然还有许多其他因素):

  • glibc是为性能和可移植性而构建的(通常添加需要大量代码的特殊情况下的性能优化)
  • musl libc是为正确性和大小而构建的,而不是为了性能(它愿意稍微慢一点,以较小的代码大小和较少的RAM运行);在资源耗尽的情况下,进行正确的错误报告(而不是立即退出)更具攻击性
  • glibc的应用更为广泛,因此针对其实现的bug往往被更快地捕获。通常,当您是第一个针对musl构建给定软件的人时,您会遇到bug(通常在该软件中,而不是musl中),或者在某些地方,维护人员明确选择使用GNU扩展,而不是坚持libc标准
  • glibc根据LGPL条款获得许可;只有GPL兼容条款下的软件才能与之静态链接;而musl是在麻省理工学院的许可下使用的,并且限制较少
比较静态构建与动态构建的优势:

  • 如果您的系统映像只有一个二进制可执行文件(用C或其他方式使用libc编写),那么静态构建总是更好,因为它会丢弃库中该可执行文件未实际使用的任何部分
  • 如果您的系统映像打算添加更多用C编写的二进制文件,那么使用动态链接将降低总体大小,因为它允许这些二进制文件使用已经存在的libc
  • 如果您的系统映像打算在不使用libc的语言中添加更多的二进制文件(Go和Rust,f/e就是这种情况),那么动态链接不会给您带来好处;您不需要libc中未使用的部分,因为您无论如何都不会使用它们


老实说,这两个图像之间并没有覆盖整个矩阵空间的可能性;在某些情况下,两者都不是最优的。拥有一个只有busybox静态链接到musl libc的映像(如果您要添加的所有内容都是非C语言的),或者拥有busybox动态链接到glibc的映像(如果您要添加更多需要libc且与musl不兼容的二进制文件)是有价值的.

哪个libc是构建busybox映像的基础?我们需要分析
busybox.tar.xz
才能知道。如果它是静态链接的,我不会感到惊讶,但即使如此,静态链接到glibc和静态链接到musl之间的大小也有巨大的差异。基本上,如何编写代码> BuyBox。TAR.XZ 需要考虑这个问题是有责任的。(介意,我认为这个问题可能是偏离主题,因为它是在寻求推荐。在两个不同的软件之间;此外,对它们之间的差异的分析不是狭隘的或具体的,因此可以说是“过于宽泛”,而且随着新版本的推出,可能会发生变化)。但我真的没有寻求建议(任何建议)。我只想知道busybox docker的使用案例……如果
alpine
提供musl作为共享库,并且
busybox
静态链接musl,这意味着
alpine
可以在添加其他共享库时产生更小的图像,但是
busybox
会马上变小——如果这种猜测是真的,那么只有当您添加不需要更多编译二进制文件(至少不是需要libc的编译二进制文件)的shell脚本时,
busybox
才会变得更有效。感谢您提供的详细答案。我想麻省理工许可证可能是一个关键因素。耸耸肩。LGPL(与常规GPL不同)对动态链接很友好,这就是为什么glibc被广泛用于商业软件的原因;大多数人不需要静态链接他们的商业工具。他说:“一些穆尔
FROM scratch
ADD alpine-minirootfs-3.12.7-x86_64.tar.gz /
CMD ["/bin/sh"]
FROM scratch
ADD busybox.tar.xz /
CMD ["sh"]