Пустой размер после сборки Docker - PullRequest
6 голосов
/ 03 июля 2019

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

FROM ubuntu AS ubuntu_build

RUN # do a lot of build things

FROM alpine

COPY --from=ubuntu_build /app /app

ENTRYPOINT whatever

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

Ответы [ 2 ]

6 голосов
/ 11 июля 2019

Distroless

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

"Distroless" изображения содержат только ваше приложение и его зависимости во время выполнения. Они не содержат менеджеров пакетов, оболочек или других программ, которые вы ожидаете найти в стандартном дистрибутиве 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. Это не становится чище, чем это. Там нет абсолютно ничего, что вы сами не положили туда. Это маршрут, выбранный, например, traefik .

FROM scratch
COPY certs/ca-certificates.crt /etc/ssl/certs/
COPY traefik /
EXPOSE 80
VOLUME ["/tmp"]
ENTRYPOINT ["/traefik"]
5 голосов
/ 03 июля 2019

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

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

Подробно относится к этому руководство

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

  • Тщательно продумайте потребности вашего приложения
    • Просто установите то, что вам действительно нужно, в dockerfile.
  • Использовать небольшое базовое изображение
  • Использовать как можно меньше слоев
    • Объедините бегите вместе, больше бегите больше слоев, больше слоев больше размера
  • Использовать файлы .dockerignore
    • Это позволяет избежать копирования всех вещей в изображения, если использовать COPY . /, больше, если не использовать .gitignore, тогда вам следует избегать использования COPY . /, который может копировать некоторые необходимые вещи в изображение.
  • Изображения Squash Docker
    • Идея заключается в том, что после создания вашего изображения вы затем максимально выравниваете его, используя такой инструмент, как docker-squash .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...