Тема
Mirror Registry — Скачивание и загрузка образов
Команда bootsmanctl mirror registry предназначена для зеркалирования образов контейнеров из исходного реестра в целевой через промежуточные tar-архивы. Это позволяет работать в air-gapped средах (без прямого доступа между реестрами) и переносить образы между машинами.
Обзор
Рабочий процесс состоит из двух этапов:
Исходный реестр ──[download]──> Tar-архивы ──[upload]──> Целевой реестрdownload— скачивает образы из исходного реестра и сохраняет их в локальные tar-архивыupload— загружает образы из локальных архивов в целевой реестр
Архивы хранятся в указанной директории и содержат манифест (mirror-manifest.json) с метаданными: список образов, контрольные суммы SHA-256 и информацию о фрагментации.
Команда download
Скачивает образы указанной версии релиза из исходного реестра в локальные архивы.
Синтаксис
bash
bootsmanctl mirror registry download \
--release=v3.3.0 \
[--archive-dir=./mirror-archives] \
[--max-archive-size=100M] \
[--encryption-password=secret] \
[--insecure] \
[--src-url] \
[--src-username] \
[--src-password]Параметры
| Параметр | Обязательный | Описание |
|---|---|---|
--release, -r | Да | Версия релиза для зеркалирования (например, v3.3.0) |
--archive-dir | Нет | Директория для сохранения архивов. По умолчанию: ./mirror-archives |
--max-archive-size | Нет | Максимальный размер одного архива (например, 1G, 500M). По умолчанию: 0 (без ограничений) |
--encryption-password | Нет | Пароль для шифрования архивов (PGP symmetric). Если не указан — архивы не шифруются |
--insecure, -i | Нет | Разрешить небезопасное подключение к реестру (без проверки TLS) |
--src-url | Нет | Адрес исходного реестра |
--src-username | Нет | Имя пользователя исходного реестра |
--src-password | Нет | Пароль пользователя исходного реестра |
Примечание 1
Исходный реестр и учётные данные автоматически определяются из файла лицензии.
Реестр и учётные данные можно задать в ручную, используя параметры --src-url, --src-username, --src-password.
В частности, с помощью этих параметров можно задать адрес и учётные данные к прокси.
Примечание 2
Параметр --src-url не должен содержать схему. Может содержать порт. И должен содержать путь.
Пример: registry.internal.com:31002/images
Примеры
Базовое скачивание (без ограничений):
bash
bootsmanctl mirror registry download --release=v3.3.0Архивы будут сохранены в ./mirror-archives/v3.3.0/.
С ограничением размера архива:
bash
bootsmanctl mirror registry download \
--release=v3.3.0 \
--max-archive-size=100MЕсли образы превышают указанный размер, они автоматически разбиваются на части.
С шифрованием архивов:
bash
bootsmanctl mirror registry download \
--release=v3.3.0 \
--max-archive-size=100M \
--encryption-password=my-secret-passwordАрхивы будут зашифрованы с помощью PGP symmetric encryption. Файлы получат расширение .enc.
Команда upload
Загружает образы из локальных архивов в целевой реестр.
Синтаксис
bash
bootsmanctl mirror registry upload \
--release=v3.3.0 \
--url=registry.target.com \
--username=admin \
--password=secret \
[--archive-dir=./mirror-archives] \
[--encryption-password=secret] \
[--force-push] \
[--insecure]Параметры
| Параметр | Обязательный | Описание |
|---|---|---|
--release, -r | Да | Версия релиза для зеркалирования (например, v3.3.0) |
--url, -U | Да | URL целевого реестра |
--username, -u | Да | Имя пользователя целевого реестра |
--password, -p | Да | Пароль пользователя целевого реестра |
--archive-dir | Нет | Директория со скаченными релизами |
--encryption-password | Нет | Пароль для расшифровки архивов (обязателен, если архивы зашифрованы) |
--force-push, -f | Нет | Заменять существующие образы с тем же именем |
--insecure, -i | Нет | Разрешить небезопасное подключение к реестру (без проверки TLS) |
Примеры
Базовая загрузка:
bash
bootsmanctl mirror registry upload \
--release=v3.3.0 \
--url=registry.internal.com \
--username=admin \
--password=secretЗагрузка зашифрованных архивов:
bash
bootsmanctl mirror registry upload \
--release=v3.3.0 \
--url=registry.internal.com \
--username=admin \
--password=secret \
--encryption-password=my-secret-passwordФормат архивов
Структура файлов
mirror-archives/v3.3.0/
├── mirror-manifest.json # Манифест с метаданными
├── mirror.tar.1 # Часть архива (без шифрования)
├── mirror.tar.2 # Часть архива (без шифрования)Или с шифрованием:
mirror-archives/v3.3.0/
├── mirror-manifest.json # Манифест с метаданными и тестовым шифротекстом
├── mirror.tar.1.enc # Зашифрованная часть архива
├── mirror.tar.2.enc # Зашифрованная часть архиваМанифест
Файл mirror-manifest.json содержит:
json
{
"createdAt": "2025-01-15T10:30:00Z",
"maxArchiveSize": 104857600,
"encryption": {
"testCiphertext": "base64-encoded-pgp-encrypted-test-message"
},
"parts": [
{
"file": "mirror.tar.1.enc",
"checksum": "sha256:def456...",
"size": 104857600,
"images": [
{
"source": "registry.src.com/nginx:1.25",
"target": "nginx:1.25",
"totalSize": 50000000
}
]
}
]
}Поле encryption присутствует только для зашифрованных архивов.
Автоматическое разбиение на части
При указании --max-archive-size работает автоматическая логика разбиения:
Значение --max-archive-size | Поведение |
|---|---|
Не указан или 0 | Без ограничений, все образы записываются как единые файлы |
Указан (например, 100M) | Умное разбиение: образы, помещающиеся в оставшееся место, записываются целиком; остальные разбиваются на фрагменты |
При разбиении фрагменты получают имена вида <base64url(sourceRef)>.chunk.0, <base64url(sourceRef)>.chunk.1 и т.д. При загрузке (upload) фрагменты автоматически собираются обратно в единый поток.
Шифрование
- Алгоритм: PGP symmetric encryption (RFC 4880 OpenPGP)
- Библиотека:
github.com/ProtonMail/gopenpgp/v3 - Проверка пароля: При скачивании создаётся тестовое сообщение, зашифрованное тем же паролем. При загрузке пароль проверяется попыткой расшифровки этого сообщения.
- Целостность: MDC (Modification Detection Code) для обнаружения изменений в данных
- Контрольные суммы: SHA-256 для каждой части архива проверяется перед обработкой
Обработка ошибок
| Ситуация | Поведение |
|---|---|
| Неправильный пароль | Ошибка: password verification failed: incorrect password |
| Повреждённый архив | Ошибка контрольной суммы перед обработкой |
| Отсутствует часть архива | Ошибка: failed to open archive file |
| Зашифрованный архив без пароля | Ошибка: archive is encrypted but no password provided |
| Незашифрованный архив с паролем | Пароль игнорируется |
| Образ уже существует в реестре | Без --force-push — пропускается с сообщением в логе |
Типичные сценарии использования
Сценарий 1: Air-gapped среда
На машине с доступом к интернету скачайте образы:
bashbootsmanctl mirror registry download --release-=v3.3.0 --encryption-password=secretПеренесите директорию
mirror-archives/v3.3.0на изолированную машину (USB, SCP и т.д.)Загрузите образы во внутренний реестр:
bashbootsmanctl mirror registry upload \ --release=v3.3.0 \ --url=registry.internal.com \ --username=admin \ --password=secret \ --encryption-password=secret
Сценарий 2: Ограничение размера для FAT32
Для переноса на носителях с ограничением размера файла (например, FAT32 — 4 ГБ):
bash
bootsmanctl mirror registry download \
--release=v3.3.0 \
--max-archive-size=3GСценарий 3: Без шифрования (доверенная сеть)
bash
# Скачивание
bootsmanctl mirror registry download \
--release=v3.3.0 \
--max-archive-size=100M
# Загрузка
bootsmanctl mirror registry upload \
--release=v3.3.0 \
--url=registry.internal.com \
--username=admin \
--password=secretСценарий 4: С использованием прокси
bash
bootsmanctl mirror registry download \
--release=v3.3.0 \
--src-url=registry.internal.com \
--src-username=admin \
--src-password=secret