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.
Проксирование upstream
Заголовок раздела «Проксирование upstream»NORA может выступать в роли pull-through кеша для Docker Hub и других реестров. Если образ не найден локально, NORA загружает его из настроенных upstream-источников.
config.toml:
[docker]enabled = trueproxy_timeout = 300
[[docker.upstreams]]url = "https://registry-1.docker.io"
[[docker.upstreams]]url = "https://ghcr.io"auth = "user:token" # опциональная базовая аутентификацияПеременные окружения:
| Переменная | Описание | По умолчанию |
|---|---|---|
NORA_DOCKER_ENABLED | Включить реестр Docker | true |
NORA_DOCKER_PROXIES | Upstream URL через запятую (url1,url2 или url1|auth1,url2) | https://registry-1.docker.io |
NORA_DOCKER_PROXY_TIMEOUT | Таймаут upstream в секундах | 300 |
Запушенные теги и upstream
Заголовок раздела «Запушенные теги и upstream»С 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) |
| Пути репозиториев любой глубины | Full | org/image, org/team/project/image |
| Bearer token аутентификация | Полная | WWW-Authenticate challenge |
Helm OCI (helm push / helm pull) | Полная | Через стандартный /v2/ API |
| Кросс-репозиторный blob mount | Full | POST /v2/{name}/blobs/uploads/?mount=<digest>&from=<repo> |
| Referrers API | — | OCI 1.1 referrers не реализовано |
Известные ограничения
Заголовок раздела «Известные ограничения»- Монолитная загрузка больших blob (>~500 МБ) может завершиться ошибкой даже при увеличенном лимите тела запроса.
- Блобы хранятся по репозиториям: слой, который есть в нескольких репозиториях, хранится в каждом из них (кросс-репозиторный mount на локальном хранилище делает жёсткую ссылку, на объектном — копию); общего хранилища блобов нет. GC удаляет слои, на которые в репозитории ничего не ссылается.
- Индекс Helm-репозитория (
index.yaml) не поддерживается; используйте только Helm OCI workflow.