OCI Image Manifest
Тема дорожной карты · Docker & Containers
Манифест OCI-образа — это компактный JSON-файл, который перечисляет config-блоб и упорядоченные слои конкретного образа. Именно этот манифест передается реестрами по запросу. Для multi-arch-образов манифест оборачивается в manifest list (или image index), который сопоставляет пары os/arch с манифестами под каждую архитектуру. Командами docker manifest inspect или docker buildx imagetools inspect можно удобно отлаживать ситуации, когда скачивается не тот архитектурный вариант, и проверять, что после buildx build --push действительно опубликованы все ожидаемые платформы.
Как это работает
OCI Image Manifest включает в себя множество пространств имен (namespaces), таких как mount, network, PID, IPC, UTS, user и cgroup, а также параметры управления ресурсами, такие как cgroups (cpu, memory, io, pids, devices). Также манифесты учитывают специфические особенности контейнеров, такие как контейнер-осведомленные файловые системы (overlay2, btrfs, zfs). Daemon Docker (dockerd) взаимодействует с низкоуровневым runtime (containerd → runc), который выполняет clone() с правильными флагами для создания контейнеров. Образы хранятся в виде контент-адресуемых tar-слоев, которые можно экспортировать и импортировать с помощью команд docker save и docker load. Daemon собирает rootfs, стекуя слои через overlayfs.
Когда применять
Внутренности манифеста OCI-образа становятся важными, когда вы (а) дебажите проблемы, связанные с тем, почему контейнер видит определенные данные или поведение, (б) выбираете подходящий storage driver (например, overlay2, который является дефолтным и почти всегда правильным), (в) оцениваете альтернативные runtime (например, Podman, containerd, CRI-O для Kubernetes), (г) строите что-то поверх Docker (например, CI-builder, sandboxing-тул). Важно прочитать документацию docker info, runc spec, а также спецификации формата OCI-образа хотя бы один раз.
Типичные ошибки
Типичные ошибки при работе с OCI Image Manifest включают выбор storage driver по старому блог-посту, где рекомендуются устаревшие настройки (например, overlay2 является ответом в 99% случаев); путаница между Docker как компанией и OCI-стандартом, который теперь реализуют все основные инструменты (например, docker pull работает с любым OCI registry); предположение, что Docker Desktop на macOS ведет себя так же, как Engine на Linux (что неверно, так как между ними находится VM с другими I/O perf и сетью). Для дебага runtime-мистики можно использовать команды strace -f и lsns.