Go известен своими статически слинкованными бинарниками. Можно взять исполняемый файл Go, положить его в контейнер с
FROM scratch - и на этом закончить.Но у такого подхода есть несколько проблем...
1. В контейнерах
FROM scratch нет нормального управления пользователямиБазовый образ
scratch — это буквально пустой образ. Поэтому файлов /etc/passwd и /etc/group там просто нет.Из-за этого контейнеризированный процесс в большинстве случаев запускается от
root.2. В
FROM scratch отсутствуют некоторые важные директории/tmp, /root, /home, /var, /etc — ничего из этого в scratch-контейнере нет, если, конечно, вы не примонтируете нужные директории самостоятельно.Из-за этого приложение может работать некорректно — попробуйте, например, создать временный файл и посмотрите, что произойдёт 😉
3. В
FROM scratch нет CA-сертификатов и данных о часовых поясахНужно обратиться к HTTPS-эндпоинту? Не получится.
Нужно выполнить преобразование времени между часовыми поясами? Тоже не получится.
4. В
FROM scratch нет runtime вашего языкаЕсли поддержка статической линковки в вашем языке не настолько хороша, как в Go, либо приложению нужен интерпретатор или runtime-окружение, использовать
scratch-контейнеры становится практически невозможно.Distroless-образы как раз решают эти проблемы, при этом оставаясь максимально близкими к подходу
FROM scratch.Хороший пример — проект
GoogleContainerTools/distroless. В нём есть следующие базовые образы:-
distroless/static = scratch + структура директорий, похожая на обычный дистрибутив, /etc/{passwd,group}, CA-сертификаты и данные о часовых поясах-
distroless/base = distroless/static + glibc-
distroless/cc = distroless/base + libgccТакже есть несколько специализированных под конкретные языки, но всё ещё distroless-образов:
-
distroless/java — для Java 17, 21 и 25-
distroless/nodejs — для Node.js 22, 24 и 26-
distroless/python3 — соответственно, для Python 3Но существуют и другие проекты и продукты.
Подробнее о distroless-образах - в туториале iximiuz Labs:
https://labs.iximiuz.com/tutorials/gcr-distroless-container-images
👉 DevOps Portal
