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

What is the difference between alpine docker image and busybox docker image?

alpine docker image and busybox docker 图片有什么区别?

当我检查他们的 dockfile 时,alpine is like this(对于 Alpine v3.12 - 3.12.7)

FROM scratch
ADD alpine-minirootfs-3.12.7-x86_64.tar.gz /
CMD ["/bin/sh"]

busybox is like this

FROM scratch
ADD busybox.tar.xz /
CMD ["sh"]

但正如https://alpinelinux.org/about/所说

Alpine Linux is built around musl libc and busybox.

那么到底有什么区别呢?

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

我的 alpine docker 遇到间歇性 DNS 查找失败,如此处 musl-libc - Alpine's Greatest Weakness and here Does Alpine have known DNS issue within Kubernetes? 所述。这是我提出问题的原因之一。

PS、https://musl.libc.org/ says "musl is an implementation of the C standard library built on top of the Linux system call API" and https://en.wikipedia.org/wiki/Alpine_Linux提到

It previously used uClibc as its C standard library instead of the traditional GNU C Library (glibc) most commonly used. Although it is more lightweight, it does have the significant drawback of being binary incompatible with glibc. Thus, all software must be compiled for use with uClibc to work properly. As of 9 April 2014,[16] Alpine Linux switched to musl, which is partially binary compatible with glibc.

它们之间的主要区别在于旧版本的busybox图像静态link针对glibc的busybox(当前版本动态link busybox 反对 glibc,因为即使在静态配置中也使用 libnss),而 alpine 图像 动态地 links 反对 musl libc。

详细讨论用于在这些之间进行选择的权重因素在这里将是题外话(软件推荐请求),但一些关键点:

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

  • glibc 是为性能和可移植性而构建的(通常添加需要大量代码的特殊情况性能优化)。
  • musl libc 是为正确性和大小而不是性能而构建的(它愿意稍微慢一点以拥有更小的代码大小和 运行 在更少的 RAM 中);面对资源耗尽,更积极地进行正确的错误报告(而不是立即退出)。
  • glibc 被更广泛地使用,因此它的实现出现的错误往往会被更快地捕获。通常,当一个人是第一个针对 musl 构建给定软件的人时,他会遇到错误(通常在该软件中,而不是在 musl 中)或维护者明确选择使用 GNU 扩展而不是坚持 libc 标准的地方.
  • glibc 根据 LGPL 条款获得许可;只有 GPL 兼容条款下的软件才能静态地 link 反对它;而 musl 受 MIT 许可,使用限制较少。

比较静态构建与动态构建的优势:

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

老实说,这两张图片本身并没有涵盖整个矩阵 space 的可能性;在某些情况下,它们都不是最佳的。拥有一个只有 busybox 的图像是有价值的 statically links against musl libc(如果你要添加的所有内容都是非 C 语言),或带有 busybox 的图像 动态 links 针对 glibc(如果您要添加更多需要 libc 且与 musl 不兼容的二进制文件)。