Я пишу оболочку API-интерфейса реестра докеров, чтобы извлекать изображения из одного частного реестра и передавать их в другой.
Основываясь на документации, сначала мне нужно получить манифест и слои для image:tag . После загрузки изображения я успешно загрузил все слои для конкретного image:tag и манифеста.
После отправки изображения я выполнил следующие шаги:
POST /v2/<name>/blobs/uploads/(чтобы получить UUID, т.е. заголовокLocation)HEAD /v2/<name>/blobs/<digest>(проверьте, существует ли он уже в реестре)PUT /v2/<name>/blobs/uploads/<uuid>?digest=<digest>(Monolithic Upload)
Что мне непонятно, так это следующее:
- Является ли
UUIDуникальным для каждого отдельного слоя, который я отправляю, или он повторно используется для всех слоев (например, нужно ли мне запускать новый POST для каждого слоя, чтобы получить новыйUUID, прежде чем я попытаюсь загрузить его?). - Раздел Завершенная загрузка указывает
Чтобы загрузка считалась завершенной, клиент должен отправить запрос PUT на конечную точку загрузки с параметром дайджеста.
Однако, как уже упоминалось, я использую монолитную загрузку, которая использует a PUT и будет тем же запросом, что и в разделе «Завершенная загрузка». Таким образом, выполняя монолитную загрузку, я одновременно завершаю загрузку?
Проблема
Когда я выполняю все вышеперечисленные шаги, я получаю ошибку
BLOB_UNKNOWNпри загрузке дайджеста, например.{ "ошибки:" [{ "код": "BLOB_UNKNOWN", "сообщение": "большой двоичный объект неизвестен реестру", "подробности": { "дайджест": } }, ... ] }
Согласно документам, эта ошибка возникает при отправке манифеста, и один из слоев в манифесте неизвестен:
Если один или несколько слоев неизвестны реестру, возвращаются ошибки BLOB_UNKNOWN. Поле сведений ответа об ошибке будет иметь поле дайджеста, идентифицирующее отсутствующий большой двоичный объект. Ошибка возвращается для каждого неизвестного большого двоичного объекта. Формат ответа следующий:
Что меня смущает в этом
- Я отправляю дайджест (он же слой), а не манифест, так почему эта ошибка возвращается?
- Я ожидаю, что большой двоичный объект будет неизвестен, потому что я помещаю новый образ в реестр.
На данный момент я собираюсь использовать клиент докеров, но я не нашел в сети ни одного примера обертки, чтобы увидеть, как это делается. Предположительно, мне не хватает какой-то логики или я неправильно понимаю документы, но я не уверен, где я ошибаюсь?