轻量级GCC高山

时间:2019-01-10 14:42:41

标签: docker gcc alpine

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

我正在尝试制作一个小的Docker映像。因此,我使用Alpine作为基本映像(5MB)。与之相比,标准的GCC安装使它相形见((> 100MB)。

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

注意:Clang差很多(我上次检查是475MB)。

1 个答案:

答案 0 :(得分:2)

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

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

首先,我假设您只需要C支持,这意味着安装了gccmusl-dev软件包(用于标准标头),使用Alpine将产生约100MB的映像3.8。

  • 如果不需要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-wrapperlto1,它们分别占用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 .