как протолкнуть образ докера через ** rest ** api с данным конфигом - PullRequest
0 голосов
/ 25 июня 2019

Я хочу создать новый образ в реестре удаленного докера, указав только частичные данные:

Согласно документам https://docs.docker.com/registry/spec/api/#pushing-an-image чтобы выдвинуть образ докера, я могу:
* опубликовать слой смолы, который у меня есть.
* опубликовать манифест
и реестр будет поддерживать мой новый новый образ.

Например:
* У меня есть локально Java-приложение в слое tar.
* В реестре удаленного докера уже есть базовый образ java8.
* Я хочу загрузить слой tar и манифест, который ссылается на базовый образ java8 и чтобы реестр докеров поддерживал новый образ для моего приложения.

(Слой tar, который я получаю от стороннего инструмента сборки под названием Bazel, если кому-то интересно)

Из документов, которые я собираю, я могу взять существующий манифест изображения java8, загрузить его, добавить (или предварительно перенести) мой новый слой в раздел слоев и альт.

Глядя на спецификации манифеста https://docs.docker.com/registry/spec/manifest-v2-2/#image-manifest-field-descriptions Я вижу, что есть раздел "объект конфигурации" с дайджестом в качестве ссылки на файл конфигурации. Это имеет смысл, мне может понадобиться переопределить точку входа, например. Итак, предположим, у меня также есть конфигурация докера в файле, который, как мне кажется, мне нужно как-то сообщить реестру.

Нигде (что я вижу) в API не указано, где или как загрузить конфигурацию, или, если мне вообще нужно это сделать - возможно, она включена в tar-слой слоя или что-то в этом роде.

Я загружаю конфигурацию как слой? это включено в смолу? если нет, то почему я даю ссылку на него в дайджесте?

Лучший ответ, на который я могу надеяться, - это последовательность http-вызовов в Docker-Registry, которые делают то, что я пытаюсь. В качестве альтернативы было бы очень полезно просто объяснить, что такое конфиг и как это сделать.

1 Ответ

0 голосов
/ 26 июня 2019

нашел решение здесь:
https://www.danlorenc.com/posts/containers-part-2/
очень подробный, отличный ответ, не знаю кто ты, но я люблю тебя!

Из проверки некоторых конфигов из существующих изображений Docker, похоже, требует несколько полей:

{
  "architecture": "amd64",
  "config": {
  },
  "history": [
    {
      "created_by": "Bash!"
    }
  ],
  "os": "linux",
  "rootfs": {
    "type": "layers",
    "diff_ids": [
      "sha256:69e4bd05139a843cbde4d64f8339b782f4da005e1cae56159adfc92311504719"
    ]
  }
}  

Раздел config может содержать переменные окружения, CMD по умолчанию и ENTRYPOINT вашего контейнера и некоторые другие настройки. Раздел rootfs содержит список слоев и diff_ids, которые очень похожи на наш манифест. К сожалению, diff_ids на самом деле немного отличается от дайджестов, содержащихся в нашем манифесте, на самом деле это sha256 «несжатых» слоев.

Мы можем создать его с помощью этого скрипта:

cat <<EOF > config.json
{
  "architecture": "amd64",
  "config": {
  },
  "history": [
    {
      "created_by": "Bash!"
    }
  ],
  "os": "linux",
  "rootfs": {
    "type": "layers",
    "diff_ids": [
      "sha256:$(gunzip layer.tar.gz --to-stdout | shasum -a 256 | cut -d' ' -f1)"
    ]
  }
}
EOF

Загрузка конфигурации Конфиги в основном хранятся в реестре как обычные капли. На них по-разному ссылаются в манифесте, но они все еще загружаются в своем дайджесте и хранятся в обычном режиме.

Здесь будет работать тот же тип скрипта, который мы использовали для слоев:

returncode=$(curl -w "%{http_code}" -o /dev/null \
    -I -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://gcr.io/v2/$PROJECT/hello/blobs/$config_digest)

if [[ $returncode -ne 200  ]]; then
    # Start the upload and get the location header.
    # The HTTP response seems to include carriage returns, which we need to strip
    location=$(curl -i -X POST \
        https://gcr.io/v2/$PROJECT/hello/blobs/uploads/ \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -d "" | grep Location | cut -d" " -f2 | tr -d '\r')

    # Do the upload
    curl -X PUT $location\?digest=$config_digest \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        --data-binary @config.json
fi
...