Перейти к содержимому

Docker

NORA реализует спецификацию OCI Distribution Spec 1.1 для хранения и проксирования контейнерных образов Docker. Загружайте собственные образы и при необходимости кешируйте загрузки из Docker Hub или других upstream-реестров.

Тегируйте и загружайте образы, используя адрес NORA напрямую:

Окно терминала
# Тегирование существующего образа
docker tag myapp:latest nora.example.com:4000/myapp:latest
# Загрузка в реестр
docker push nora.example.com:4000/myapp:latest
# Скачивание из реестра
docker pull nora.example.com:4000/myapp:latest

Для небезопасных (HTTP) реестров добавьте NORA в конфигурацию демона Docker (/etc/docker/daemon.json):

{
"insecure-registries": ["nora.example.com:4000"]
}

После редактирования перезапустите Docker.

NORA может выступать в роли pull-through кеша для Docker Hub и других реестров. Если образ не найден локально, NORA загружает его из настроенных upstream-источников.

config.toml:

[docker]
enabled = true
proxy_timeout = 300
[[docker.upstreams]]
url = "https://registry-1.docker.io"
[[docker.upstreams]]
url = "https://ghcr.io"
auth = "user:token" # опциональная базовая аутентификация

Переменные окружения:

ПеременнаяОписаниеПо умолчанию
NORA_DOCKER_ENABLEDВключить реестр Dockertrue
NORA_DOCKER_PROXIESUpstream URL через запятую (url1,url2 или url1|auth1,url2)https://registry-1.docker.io
NORA_DOCKER_PROXY_TIMEOUTТаймаут upstream в секундах300

С 1.4.0 на запушенный тег отвечает только запушенный манифест, даже если до push тег уже скачивали через прокси: push записывает себя в метаданные тега и удаляет проксированную копию. Курация датирует такой тег по push. Манифест, запрошенный по дайджесту, всегда имеет этот дайджест: ответ upstream с другим дайджестом считается сбоем upstream, а push по дайджесту с другими байтами — 400 DIGEST_INVALID. Теги, оканчивающиеся на .meta или .stats, отклоняются с 400.

Endpoint / ФункцияСтатусПримечание
/v2/ (проверка версии)ПолнаяПроверка версии API
/v2/_catalog (список репозиториев)ПолнаяСписок всех репозиториев
/v2/{name}/tags/listПолнаяСписок тегов образа
/v2/{name}/manifests/{ref} GET/HEAD/PUT/DELETEПолнаяПо тегу или дайджесту
/v2/{name}/blobs/{digest} GET/HEAD/DELETEПолнаяСкачивание/проверка/удаление слоёв
/v2/{name}/blobs/uploads/ POST/PATCH/PUTПолнаяПотоковая загрузка (chunked upload)
Пути репозиториев любой глубиныFullorg/image, org/team/project/image
Bearer token аутентификацияПолнаяWWW-Authenticate challenge
Helm OCI (helm push / helm pull)ПолнаяЧерез стандартный /v2/ API
Кросс-репозиторный blob mountFullPOST /v2/{name}/blobs/uploads/?mount=<digest>&from=<repo>
Referrers API—OCI 1.1 referrers не реализовано
  • Монолитная загрузка больших blob (>~500 МБ) может завершиться ошибкой даже при увеличенном лимите тела запроса.
  • Блобы хранятся по репозиториям: слой, который есть в нескольких репозиториях, хранится в каждом из них (кросс-репозиторный mount на локальном хранилище делает жёсткую ссылку, на объектном — копию); общего хранилища блобов нет. GC удаляет слои, на которые в репозитории ничего не ссылается.
  • Индекс Helm-репозитория (index.yaml) не поддерживается; используйте только Helm OCI workflow.