Уменьшение размера пустышки после сборки Docker

Используя многоступенчатые сборки, я хочу уменьшить размер изображения в конце Dockerfile, примерно так:

FROM ubuntu AS ubuntu_build

RUN # do a lot of build things

FROM alpine

COPY --from=ubuntu_build /app /app

ENTRYPOINT whatever

изображение alpine маленькое, и теоретически из образа ubuntu будет скопировано только содержимое / app. Это лучший трюк в книге или есть какой-то другой способ минимизировать размер окончательного изображения?


person Alexander Mills    schedule 02.07.2019    source источник


Ответы (2)


Без дистрибутива

Google предоставляет инструкции и инструменты для создания образов без дистрибутива.

Образы «без дистрибутивов» содержат только ваше приложение и его зависимости времени выполнения. Они не содержат менеджеров пакетов, оболочек или каких-либо других программ, которые вы ожидаете найти в стандартном дистрибутиве Linux.

Зачем мне использовать образы без дистрибутива?

Ограничение содержимого вашего контейнера времени выполнения только тем, что необходимо вашему приложению, - это лучший метод, применяемый Google и другими техническими гигантами, которые уже много лет используют контейнеры в производственной среде. Он улучшает соотношение сигнал / шум сканеров (например, CVE) и снижает бремя установления происхождения до того, что вам нужно.

Если ваше приложение представляет собой скомпилированный двоичный файл, вы можете обойтись одним двоичным файлом плюс разделяемыми библиотеками, с которыми он связан. Если вы ограничите библиотеки, которые вы связываете, вам может понадобиться только пара. Вот, например, то, что минимальная программа на C, скомпилированная со ссылками на gcc, на моей машине:

$ ldd basic-program
        linux-vdso.so.1 (0x00007fffd3fa2000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2e4611b000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f2e4670e000)

Черт возьми, вы даже можете статически связать всю программу и вообще не иметь никаких зависимостей.

Google предоставляет набор базовых изображений, ориентированных на разные языки:

У них есть только несколько основных файлов, намного меньше, чем то, что включает даже минимальный дистрибутив, такой как alpine, поскольку в нем все еще есть apk менеджер пакетов, утилиты пользовательского пространства и т. Д. Вы используете их так же, как вы описываете в своем вопросе: как последний этап в многоступенчатой ​​сборке.

FROM gcr.io/distroless/base
COPY --from=build /go/bin/app /
CMD ["/app"]

С нуля

Вы также можете пройти полный путь «сыроедение-жизнь-в-лесу» и создать окончательный образ FROM scratch. Нет ничего чище, чем это. Абсолютно ничего, что ты не клал туда сам. Это маршрут

person John Kugelman    schedule 11.07.2019

Помимо использования multi-stage, другим типичным способом является использование docker-slim для уменьшения размера окончательного построенного изображения, например:

docker-slim build --http-probe your-name/your-app

Подробнее см. В этом руководстве.

Добавьте другие общие мысли отрывок из "Пять способов похудеть Ваши образы Docker », если вам нужно:

  • Think Carefully About Your Application’s Needs
    • Just install what you really needed in dockerfile.
  • Use a Small Base Image
  • Use as Few Layers As Possible
    • Combine run together, more run more layers, more layers more size
  • Use .dockerignore files
    • This avoid copy all things to images if use COPY . /, more, if not use .gitignore, you then need to avoid to use COPY . / which may copy some necessary things to image.
  • Squash Docker Images
    • The idea here is that after your image is created, you then flatten it as much as possible, using a tool such as docker-squash.
person atline    schedule 02.07.2019