Product SiteDocumentation Site

12.4.4. Зеркалирование OCI-реестров с помощью Zot

Zot поддерживает зеркалирование одного или нескольких внешних OCI-совместимых реестров. Это позволяет создавать локальные копии образов для ускорения сборки, снижения сетевых затрат и работы в изолированных (air-gapped) средах.

Важно

По умолчанию Zot работает как чистый OCI-реестр. При загрузке образов в формате Docker они автоматически конвертируются в OCI. В результате:
  • хеш образа (digest) изменяется;
  • подписи (Cosign, Notary) становятся недействительными;
  • некоторые не-OCI атрибуты могут быть утеряны.
Чтобы сохранить подписи, отключите конвертацию:
{
  "http": { "compat": true },
  "extensions": { "sync": { "preserveDigest": false } }
}
В этом случае образы остаются в исходном формате, и подписи работают корректно.

Таблица 12.5. Режимы зеркалирования

Режим
Описание
Когда использовать
Полное зеркало (periodic sync)
Zot периодически опрашивает внешний реестр и заранее кеширует указанные образы
Для критически важных образов, когда требуется гарантированная доступность без задержек
Кеш по запросу (pull-through / on-demand)
Образ загружается из внешнего реестра только при первом запросе и кешируется локально. Последующие запросы обслуживаются из кеша
Для экономии места и при работе с большими реестрами (например, Docker Hub)

Примечание

Особенность Docker Hub: из-за ограничений на частоту запросов и отсутствия поддержки каталога (_catalog) рекомендуется использовать только режим on-demand. Периодический опрос (pollInterval) не рекомендуется.
Функция синхронизации (sync) настраивается в секции extensions файла config.json.
Пример конфигурации:
{
    "extensions": {
        "sync": {
            "credentialsFile": "/etc/zot/sync-auth.json",
            "registries": [
            {
                "urls": ["https://registry.altlinux.org"],
                "onDemand": true,
                "pollInterval": "12h",
                "tlsVerify": true,
                "maxRetries": 3,
                "retryDelay": "5m",
                "onlySigned": false,
                "preserveDigest": false,
                "content": [
                {
                    "prefix": "myapp/**",
                    "destination": "mirror/myapp",
                    "stripPrefix": true
                }
                ]
            }
            ]
        }
    }
}

Таблица 12.6. Описание параметров

Параметр
Описание
Уровень sync
credentialsFile
Путь к файлу с учётными данными для внешних реестров
Уровень registries[]
urls
Список URL внешних реестров (резервные адреса в порядке приоритета)
onDemand
true — включить кеширование по запросу; false — использовать только предварительно синхронизированные образы
pollInterval
Интервал полного опроса (например, "6h"). Если не задан — используется только on-demand
tlsVerify
Проверка TLS-сертификатов (true по умолчанию)
certDir
Каталог с доверенными сертификатами
maxRetries, retryDelay
Параметры повторных попыток при ошибках
syncTimeout
Таймаут операции синхронизации (по умолчанию — 3 часа)
onlySigned
Синхронизировать только подписанные образы (Cosign/Notary)
preserveDigest
true – попытка сохранить digest (не гарантирует работу подписей); false — конвертировать в OCI (рекомендуется для совместимости)
Уровень content[]
urls
Список URL внешних реестров (резервные адреса в порядке приоритета)
prefix
Путь во внешнем реестре (поддерживает glob: *, **)
tags.regex
Фильтр тегов по регулярному выражению
tags.semver
Фильтр по semantic versioning
destination
Локальный путь для хранения образа
stripPrefix
Удалять префикс из prefix при сохранении (true → /repo/app → app)
Файл, указанный в credentialsFile, содержит учётные данные:
{
    "registry.altlinux.org": {
        "username": "zot-sync",
        "password": "secret"
    },
    "gcr.io": {
        "username": "_json_key",
        "password": "{ ... }"
    }
}
Примеры использования:
  • полное зеркало критических образов:
    {
        "onDemand": false,
        "pollInterval": "24h",
        "content": [{ "prefix": "infra/nginx" }]
    }
    
    Ежедневно синхронизирует только стабильные версии nginx.
  • кеш по запросу для registry.altlinux.org:
    {
        "urls": ["https://registry.altlinux.org"],
        "onDemand": true,
        "content": [
        {
            "prefix": "p11/**",
            "destination": "mirror/p11",
            "stripPrefix": true
        }]
    }
    
    Образы загружаются только при первом обращении, например:
    $ podman pull 192.168.0.165:5000/mirror/p11/flannel:latest
    
  • миграция реестра (перенос всего содержимого):
    {
        "pollInterval": "12h",
        "onDemand": true,
        "content": [{ "prefix": "**" }]
    }
    
    После полной синхронизации можно перенаправить трафик на новый Zot.