#реальные_вопросы #docker
А теперь, как я обещал, вопрос из новой меты, даже не вопрос, а целая задачка.
Задача:
На изображении мы видим Dockerfile, в котором за основу берется базовый образ alpine, в контейнер копируется файл размеров 1Gb, следующая инструкция меняет права файла. Вопрос: какого размера получится докер образ?
Ответ:
Образ будет весить ~2.01GB.
Подробный разбор:
Каждая инструкция в файле порождает новый слой, размер образа растет путем простого сложения их размеров.
Слой 1. FROM
Базовый образ Alpine (версия latest) занимает около 8 MB. Минималистичный дистрибутив, он очень популярен, благодаря своему небольшому размеру.
Слой 2. COPY
Файл testfile.img размером 1 GB копируется в контейнер. Docker добавляет новый слой (layer) для этой инструкции, и размер слоя равен размеру файла (в нашем случае случае 1 GB).
Слой 3. RUN
Вносит изменения в файл testfile.img. Docker создает новый слой для этой операции. Даже если изменяются только метаданные (например, права доступа), весь файл копируется в новый слой. Это связано с механизмом Copy-on-Write (COW), который требует копировать весь файл при любых модификациях.
Новый слой добавляет еще 1 GB из-за копирования нашего файла на новый слой.
Итого:
Размер Alpine: ~8 MB.
Слой с копированием файла: ~1 GB.
Слой с изменением прав: ~1 GB.
2.01 GB.
Как исправить?
Копировать файл сразу с нужными правами (заменить последние две инструкции на эту):
COPY --chmod=600 testfile.img /testfile.img
Немного о механизме Copy-on-Write (COW)
Я рассмотрю COW подробнее в другом посте, а пока расскажу о простом правиле. Слои в OverlayFS являются неизменяемыми, стратегия Copy-on-write, обеспечивает совместное использование и копирование файлов, если файл или каталог существует в нижнем слое образа, а другому слою требуется доступ к нему на чтение, он просто использует существующий файл. А когда другому слою потребуется изменить файл, файл копируется в этот слой и изменяется.
