Alpine 的轻量级 GCC

Lightweight GCC for Alpine

是否有可以在 Alpine 中安装的轻量级 GCC 发行版?

我正在尝试制作一张小 Docker 图片。出于这个原因,我使用 Alpine 作为基础图像 (5MB)。相比之下,标准 GCC 安装使它相形见绌 (>100MB)。

那么有没有我可以在 Alpine 上安装的轻量级 GCC 发行版?

注意:Clang 更糟糕(我上次检查时为 475MB)。

据我所知,没有这样的映像可用,但您可以通过删除不需要的 GCC 二进制文件来使 GCC 更苗条。

这在很大程度上取决于 GCC 需要哪些功能。

作为起点,我假设您只需要 C 支持,这意味着安装了 gccmusl-dev 包(用于标准头文件),这将产生约 100MB 的图像使用 Alpine 3.8.

  • 如果您不需要 Objective-C 支持,您可以删除 cc1obj,这是 Objective-C 后端。在 Alpine 3.8 上,它将位于 /usr/libexec/gcc/x86_64-alpine-linux-musl/6.4.0/cc1obj,占用 17.6MB。
  • 如果您不需要 link 时间优化 (LTO),您可以删除 LTO 包装器和主要可执行文件,lto-wrapperlto1,它们占用 700kb 和 16.8 MB分别。 虽然 LTO 优化可能很强大,但在大多数应用程序中,它可能只会带来较小的速度和大小改进(百分之几)。另外,您必须选择加入 LTO,大多数应用程序都不会这样做,因此它可能是一个很好的移除候选者。
  • 您可以删除 Java 前端 gcj,它似乎无论如何都不起作用。它位于 /usr/bin/x86_64-alpine-linux-musl-gcj,重量为 812kb。

通过删除这些并压缩生成的图像,它会缩小到 64.4MB,这仍然相当大。您可以通过删除额外的文件来进一步缩小,但这样您可能会失去一些所需的功能,并且需要做出不那么吸引人的权衡。

这是一个 Dockerfile 示例:

FROM alpine:3.8

RUN set -ex && \
    apk add --no-cache gcc musl-dev

RUN set -ex && \
    rm -f /usr/libexec/gcc/x86_64-alpine-linux-musl/6.4.0/cc1obj && \
    rm -f /usr/libexec/gcc/x86_64-alpine-linux-musl/6.4.0/lto1 && \
    rm -f /usr/libexec/gcc/x86_64-alpine-linux-musl/6.4.0/lto-wrapper && \
    rm -f /usr/bin/x86_64-alpine-linux-musl-gcj

测试使用: sudo docker image build --squash -t alpine-gcc-minimal .