OCI (Open Container Initiative) - відкриті специфікації формату образів, середовища запуску й протоколу реєстрів. Завдяки ним образ, зібраний Docker, запускається в containerd, Podman, Kubernetes, а реєстри (Docker Hub, GHCR, ECR) взаємозамінні.
З чого складається образ:
- шари - архіви змін файлової системи, кожен адресується дайджестом свого вмісту;
- конфігурація - JSON з налаштуваннями запуску (
CMD,ENTRYPOINT,ENV, користувач, порти) і історією збирання; - маніфест - перелік: яка конфігурація й які шари складають образ, з їхніми дайджестами;
- індекс (image index, раніше manifest list) - для мультиплатформних образів: посилання на маніфести для кожної архітектури, а також на атестації (SBOM, provenance).
Дайджест образу - це дайджест маніфесту (чи індексу), тож він однозначно визначає весь вміст.
Мітки (labels) і анотації - метадані образу:
LABEL org.opencontainers.image.source="https://github.com/acme/app" \
org.opencontainers.image.revision="a1b2c3d" \
org.opencontainers.image.version="1.4.2" \
org.opencontainers.image.licenses="MIT"
- labels зберігаються в конфігурації образу - видно через
docker inspect; - анотації - поля в маніфесті чи індексі; їх читають реєстри й інструменти, не завантажуючи весь образ:
docker buildx build --annotation "index:org.opencontainers.image.source=https://github.com/acme/app" ...
Навіщо стандартні ключі org.opencontainers.image.*:
source- GHCR автоматично пов'язує пакет образу з репозиторієм GitHub, сканери вразливостей і Renovate знаходять, звідки образ;revision,version,created- з образу видно, який коміт і яка версія в ньому, без зовнішніх записів;licenses,vendor,title,description- для каталогів і перевірок відповідності.
Генерувати метадані в CI зручно дією docker/metadata-action: вона створює теги (за гілкою, SHA, версією) і стандартні мітки з контексту репозиторію.
Практичне значення для співбесіди: розуміти, що тег - лише посилання на маніфест, дайджест - незмінний ідентифікатор, мультиплатформний образ - індекс з кількома маніфестами, а атестації - теж частина індексу. Це пояснює більшість «дивних» ситуацій: чому docker pull на Mac і на сервері дає різні дайджести того самого тегу, чому образ з атестаціями показує в реєстрі «unknown/unknown» платформу, і чому видалення тегу не видаляє образ.