轻量级GCC适用于Alpine

8

我能在Alpine上安装的轻量级GCC发行版是什么?

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

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

注意:Clang更糟糕(据我所知,最近一次检查为475MB)。


“轻量级GCC发行版”是什么意思?GCC只是一个软件包(或一些集合)。实际上,它需要几十兆字节的空间(在我的Debian/Sid上,它的/usr/lib/gcc/x86_64-linux-gnu/8/cc1plus占用25兆字节,而且编译C++代码需要更多的空间)。 - Basile Starynkevitch
你真的需要gcc/clang吗?或者对你来说,tcc是否足够好? - Marc Glisse
我以前从未听说过那个。但是我需要C++,所以我想不行了。 - bremen_matt
好的,请下次在问题中更明确地陈述您的要求。 - Marc Glisse
1个回答

8
据我所知,没有这样的映像可用,但您可以通过删除不需要的GCC二进制文件来使GCC变得更轻巧。
这非常取决于从GCC所需的功能是什么。
作为起点,假设您只需要C支持,这意味着安装了gcc和musl-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

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

啊哈!我已经像你建议的那样删除文件了,但我不知道docker squash命令。如果没有它,生成的docker文件仍然很大,因为它们必须包括带有完整gcc的层... - bremen_matt
这可能是我采取的方向。 - bremen_matt
@valiano 我不确定,但对我有效的是使用以下命令: RUN apk add --update --no-cache gcc>9.2.0-r3 我认为,据我所知,AlpineLinux存在某个版本的GCC问题。 - Mohamed Saleh
或者只需使用多阶段构建 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接