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"]