用于 Alpine 的轻量级 GCC

bre*_*att 5 gcc docker alpine-linux

我可以在 Alpine 中安装轻量级 GCC 发行版吗?

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

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

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

val*_*ano 5

AFAIK,没有这样的图像可用,但是您可以通过删除不需要的 GCC 二进制文件来使 GCC 更纤薄。

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

作为起点,我假设您只需要 C 支持,这意味着安装了gccmusl-dev包(用于标准标头),这会导致使用 Alpine 3.8 生成约 100MB 的映像。

  • 如果您不需要 Objective-C 支持,您可以删除cc1obj,它是 Objective-C 后端。在 Alpine 3.8 上,它将位于/usr/libexec/gcc/x86_64-alpine-linux-musl/6.4.0/cc1obj,并占用 17.6MB。
  • 如果您不需要链接时间优化 (LTO),您可以删除 LTO 包装器和主要可执行文件,lto-wrapper以及lto1分别占用 700kb 和 16.8MB 的空间。虽然 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
Run Code Online (Sandbox Code Playgroud)

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