Alpine 的轻量级 GCC
Lightweight GCC for Alpine
是否有可以在 Alpine 中安装的轻量级 GCC 发行版?
我正在尝试制作一张小 Docker 图片。出于这个原因,我使用 Alpine 作为基础图像 (5MB)。相比之下,标准 GCC 安装使它相形见绌 (>100MB)。
那么有没有我可以在 Alpine 上安装的轻量级 GCC 发行版?
注意:Clang 更糟糕(我上次检查时为 475MB)。
据我所知,没有这样的映像可用,但您可以通过删除不需要的 GCC 二进制文件来使 GCC 更苗条。
这在很大程度上取决于 GCC 需要哪些功能。
作为起点,我假设您只需要 C 支持,这意味着安装了 gcc
和 musl-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-wrapper
和 lto1
,它们占用 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 .
是否有可以在 Alpine 中安装的轻量级 GCC 发行版?
我正在尝试制作一张小 Docker 图片。出于这个原因,我使用 Alpine 作为基础图像 (5MB)。相比之下,标准 GCC 安装使它相形见绌 (>100MB)。
那么有没有我可以在 Alpine 上安装的轻量级 GCC 发行版?
注意:Clang 更糟糕(我上次检查时为 475MB)。
据我所知,没有这样的映像可用,但您可以通过删除不需要的 GCC 二进制文件来使 GCC 更苗条。
这在很大程度上取决于 GCC 需要哪些功能。
作为起点,我假设您只需要 C 支持,这意味着安装了 gcc
和 musl-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-wrapper
和lto1
,它们占用 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 .