Легкий GCC для Alpine - PullRequest
       31

Легкий GCC для Alpine

0 голосов
/ 10 января 2019

Существует ли облегченный дистрибутив GCC, который я могу установить в Alpine?

Я пытаюсь сделать небольшое изображение Docker. По этой причине я использую Alpine в качестве базового изображения (5 МБ). Стандартная установка GCC превосходит это в сравнении (> 100 МБ).

Так есть ли легкий дистрибутив GCC, который я могу установить на Alpine?

Примечание: Clang намного хуже (475MB в последний раз я проверял).

1 Ответ

0 голосов
/ 11 января 2019

Нет такого изображения, AFAIK, но вы можете сделать GCC тоньше, удалив ненужные двоичные файлы GCC.

Это очень сильно зависит от того, какие возможности требуются от GCC.

В качестве отправной точки, я предполагаю, что вам нужна только поддержка C, что означает, что установлены пакеты gcc и musl-dev (для стандартных заголовков), в результате образ с размером ~ 100 МБ в Alpine 3.8.

  • Если вам не нужна поддержка Objective-C, вы можете удалить cc1obj, то есть бэкэнд Objective-C. На Alpine 3.8 он будет расположен на /usr/libexec/gcc/x86_64-alpine-linux-musl/6.4.0/cc1obj и занимает 17,6 МБ.
  • Если вам не нужна оптимизация времени ссылки (LTO), вы можете удалить оболочку LTO и основные исполняемые файлы lto-wrapper и lto1, которые занимают 700 КБ и 16,8 МБ соответственно. Хотя оптимизация LTO может быть мощной, в большинстве приложений она может привести лишь к незначительным улучшениям скорости и размера (несколько процентов). Кроме того, вы должны подписаться на LTO, что не делается в большинстве приложений, поэтому он может быть хорошим кандидатом на удаление.
  • Вы можете удалить внешний интерфейс Java, gcj, который, похоже, не работает в любом случае. Он расположен на /usr/bin/x86_64-alpine-linux-musl-gcj, и весит 812kb.

Если удалить их и сжать получившееся изображение, оно уменьшится до 64,4 МБ, что все еще значительно больше. Возможно, вам удастся еще больше сжать, удалив дополнительные файлы, но тогда вы потеряете некоторые желаемые функции и получите менее привлекательный компромисс.

Вот пример 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 .

...