Как стать автором
Обновить

Комментарии 20

Мне кажется, что заголовок слишком категоричен, хотя очевидно, что проблемы и вправду есть. Я правда тоже сталкивался с некоторыми проблемами, при использовании альпайна, но они тоже все были связаны с переходом на поетрю и пайдантик в проектах. С тех пор, когда это зависит от меня, использую двухэтапную сборку на базе slim контейнеров.

Да, сборка на базе debian более предсказуемая что ли.

На alpine у меня крутятся совсем уж простые приложения типа notifier (данные из http перекладывает в telegram). Там кода совсем немного и будет легко отдебажить если что. Вот для него экономия в размере получилась больше, чем в 2 раза. Это, как по мне, уже существенно.

Не пробовали Configuring Docker with Btrfs ну и Use the BTRFS storage driver?

Ну и так, например:

find /usr/share/doc -depth -type f | xargs rm || true
rm -rf /usr/share/man/* /usr/share/groff/* /usr/share/info/* /usr/share/lintian/* /usr/share/linda/* /var/cache/man/*

Нет, с btrfs не пробовал экспериментировать, так что спасибо за наводку.

А чем здесь поможет btrfs?

В целом, можно взять образ на основе Debian slim, применить скрипт выше, и с помощью multistage скопировать все файлы в новый stage на базе scratch. По сути это будет тоже самое, что слить все правки в один слой. А поверх него уже собирать образ с приложением.

Используется сжатие на уровне файловой системы btrfs с zstd компрессией.(Use the BTRFS storage driver)

sudo apt install btrfs-progs btrfs-compsiz

Скрин для примера

Для экономии места можно схлопнуть все промежуточные слои в один финальный слой так: sudo docker build --squash -t
Параметр squash (Squash an image’s layers (--squash) experimental).

Не, squash всех слоев в образе с приложением полностью ломает кэширование.

А squash только одного слоя (который к тому же можно сделать отдельным образом) все ещё даёт возможность использовать кэш, правда только при сборке на том же хосте, где собиралась предыдущая версия образа

"применить скрипт выше" это какой?

а можно сложный вопрос - Работает ли в докере компрессия памяти? те имея 100500 запущенных "контейнеров" на сервере жмется ли память для них? дедупликация?

Речь об оперативной памяти?

да, именно про нее - тк кпд использования при существенных количествах мелких контейнеров становится критичным

Я просто не совсем понимаю, о какой компрессии и дедупликации идёт речь. zram? KSM+copy-on-write?

Контейнеры - это обычные процессы, запущенные в своих изолированных namespace (pid, network, fs, etc). Все, что работает для процессов на хосте, работает и для процессов в контейнерах.

Насколько я понимаю, контейнер - такой же процесс ОС, как и любой другой, но с выделенной cgroups (namespaces и layerfs). Т.е. если в целом компрессия памяти на хостовой ОС включена, то она будет работать и для контейнера.

У альпайна еще были проблемы с резолвингом ДНС. Незнаю как сейчас правда.

Не понимаю зачем вообще использовать Alpine образы. В debian есть куча мусора, но кому до неё есть дело, если кроме места на диске, она ни как негативно не влияет на производительность и скорость разработки? 100мб лишнего занятого пространства, как мне кажется наименьшая из проблем, даже если образов десятки

Не знаю как это применить, но оч интересно!

Есть причина не использовать. И она весьма серьёзная. В alpine используется musl вместо glibc, что может приводить к случайным падением сервисов на python/jvm/и тд под нагрузкой.

При этом совершенно не понятны плюсы, кроме размера одного базового образа.

Размер образа перестаёт иметь значение когда у вас больше одного контейнера.
Нижние слои переиспользуются, можно даже собрать базовый контейнер с основными зависимостями для вашего стека и переиспользовать его во всех контейнерах.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории