Как отправить изображение в реестр Docker с помощью API реестра Docker v2 - PullRequest
0 голосов
/ 07 февраля 2019

Я пишу оболочку API реестра Docker для извлечения изображений из одного частного реестра и отправки их в другой.

На основании документации сначала мне нужно вытащить манифест и слои для image:tag.После Создание изображения Я успешно загрузил все слои для определенного image:tag и манифеста.

После Нажав на изображение Я выполнил следующие шаги:

  1. POST /v2/<name>/blobs/uploads/ (чтобы получить UUID, т.е. заголовок Location)
  2. HEAD /v2/<name>/blobs/<digest> (проверьте, существует ли он уже в реестре)
  3. PUT /v2/<name>/blobs/uploads/<uuid>?digest=<digest> (Monolithic Upload)

Что мне не ясно, так это следующее:

  1. Является ли UUID уникальным для каждого отдельного слоя, который я нажимаю, или это повторно используется для всех слоев (например, нужно ли запускать новый POST для каждого слоя и получать новый UUID, прежде чем я попытаюсьзагрузить его?).
  2. В разделе Завершенная загрузка указано

Чтобы загрузка считалась завершенной, клиент должен отправить запрос PUTна конечной точке выгрузки с параметром дайджеста

Однако, как уже упоминалось, я использую Монолитная выгрузка , которая использует PUT и будет таким же запросом, что и враздел «Завершенная загрузка».Итак, выполняя монолитную загрузку, я также одновременно завершаю загрузку?

Проблема

  1. Когда я выполняю все шаги, описанные вышеЯ получаю ошибку BLOB_UNKNOWN при загрузке дайджеста, например,

    {"errors:" [{"code": "BLOB_UNKNOWN", "message": "BLOB-объект, неизвестный реестру", "detail": {"digest":}}, ...]}

Согласно документам эта ошибка возникает при нажатии манифеста и один из слоев в манифесте неизвестен:

Если один или несколько слоев неизвестны реестру, возвращаются ошибки BLOB_UNKNOWN.Поле подробного ответа об ошибке будет иметь поле дайджеста, идентифицирующее отсутствующий большой двоичный объект.Ошибка возвращается для каждого неизвестного большого двоичного объекта.Формат ответа выглядит следующим образом:

Что меня смущает в этом:

  1. Я нажимаю дайджест (он же слой), а не манифест, так почему эта ошибкавозвращение?
  2. Я ожидаю, что большой двоичный объект будет неизвестен, потому что я помещаю новое изображение в реестр

Пока я собираюсь использовать докер-клиент, но яне нашел ни одного примера обёртки в Интернете, чтобы увидеть, как это происходит.Предположительно, мне не хватает какой-то логики или недоразумений в документах, но я не уверен, где я ошибаюсь?

1 Ответ

0 голосов
/ 17 июля 2019

Ух, приятно знать, что я не единственный, кто потерял в пустоте API V2 ...

Я внедряю похожую библиотеку и столкнулся с той же проблемой.Из моего понимания документации есть две загрузки Monolithic : вариант с одним обменом POST (упомянутый внизу документации) и вариант с двумя обменами POST + PUT (упомянутый вверхняя часть документов).

Я не смог заставить работать метод POST-only.В моем случае я использовал его для загрузки манифеста изображения после блобов слоя и до манифеста реестра.В то время как POST выглядит успешным и возвращает 202, запись в журнал отладки в реестре показывает, что он никогда не реплицируется из места размещения в хранилище данных (как это происходит после частичной загрузки).Последующая попытка загрузить манифест завершается с ошибкой 400 и отладкой журнала «blob unknown to registry».

Однако я смог обойти эту проблему с помощью POST +Метод PUT.

Ключевые разделы в документации для меня были:

Хотя для заголовка Location указан формат URI (/ v2 // blobs / uploads /), клиентыследует рассматривать его как непрозрачный URL и никогда не пытаться его собрать.

и

Монолитная загрузка - это просто фрагментная загрузка с одним фрагментом ...

Следуя этим двум инструкциям, я создал новый заголовок Location (и UUID) с помощью POST, добавил значение дайджеста и завершил загрузку, поместив BLOB-объект в измененное местоположение.

Sideпримечание: просматривая журналы отладки реестра, интерфейс командной строки Docker проверяет наличие больших двоичных объектов до , начиная новую загрузку (и после завершения загрузки также - при условии, что в качестве двойной проверки используется код состоянияе).

...