Как я могу разрешить платформу ОС образа докера? - PullRequest
1 голос
/ 17 апреля 2019

Есть ли способ определить версию образа докера операционной системы программно, не извлекая образ или не проверяя файл докера?

Когда я смотрю на популярные изображения на док-станции (например, openjdk), кажется, что соглашение заключается в кодировании операционной системы в имя тега (например, windowsservercore-1803). Проблема с этим подходом состоит в том, что не все изображения могут следовать этому соглашению.

Кажется, что докер действительно знает платформу, потому что, когда я извлекаю образ nginx в Windows, он жалуется, что платформа не поддерживается этим образом.

Предлагает ли docker механизм, управляемый API, для разрешения платформы операционной системы для заданного имени и тега образа?

Я нашел Как отфильтровать изображения Docker по платформе? , но для этого необходимо, чтобы изображение уже было извлечено. Я ищу решение, которое позволило бы мне запросить реестр с помощью image:tag и получить os/arch без вытягивания изображения.

Я также обнаружил https://docs.docker.com/engine/reference/commandline/manifest/, но это все еще экспериментально, и, похоже, ему необходим файл манифеста для присутствия на локальной машине.

1 Ответ

2 голосов
/ 17 апреля 2019

Подход 1 - API механизма Docker

Вы можете получить информацию об изображении с помощью Docker Engin API: Получить информацию об изображении из реестра

Например, вам нужночтобы получить информацию о платформе для изображения openjdk с тегом 10.0.1-jdk-windowsservercore-1709, вы можете вызвать API механизма докера, как показано ниже:

curl --unix-socket /var/run/docker.sock  "http://v1.39/distribution/openjdk:10.0.1-jdk-windowsservercore-1709/json"

PS: v1.39 - это моя версия докера, вы должны заменить ее в соответствии св вашу среду докера.

Ответ:

{
    "Descriptor":{
        "mediaType":"application/vnd.docker.distribution.manifest.list.v2+json",
        "digest":"sha256:8394bc010c538ffc5f56386466a728d205edd70317bd320aa44e50c8533a229a",
        "size":480
    },
    "Platforms":[
        {
            "architecture":"amd64",
            "os":"windows",
            "os.version":"10.0.16299.547"
        }
    ]
}

Поле Platforms должно быть тем, что вам нужно:

Массив, содержащий все платформы, поддерживаемыеimage

Существует документ , описывающий, как вызвать API механизма докера.

Подход 2 - API реестра Docker

Для вызова докераAPI реестра, вам просто нужен http-клиент, например.curl, док-клиент не требуется.

1.Получите токен авторизации.

Для получения более подробной информации см. Спецификация аутентификации токена .

Например, вам необходимо выполнить запрос к изображению library/openjdk

curl --url "https://auth.docker.io/token?service=registry.docker.io&scope=repository:library/openjdk:pull"

scope поле указывает, какое image необходимо запросить при вызове API подпоследовательности.

Ответ:

{"token": "eyJhb......"}

Сохраните token из ответа выше.

2.Получить манифест изображения

Ссылка:

2.1. HTTP-интерфейс Docker Registry V2 # manifest
2.2. Основной файл изображения

Например, вам нужно получить манифест изображения openjdk с тегом 10.0.1-jdk-windowsservercore-1709, затем вы можете сделать запрос, подобный этому:

curl -H "Accept: application/vnd.docker.distribution.manifest.list.v2+json" -H "Authorization: Bearer eyJh..." --url "https://registry.hub.docker.com/v2/library/openjdk/manifests/10.0.1-jdk-windowsservercore-1709"

Примечание : замените поле заголовка Authorization токеном, полученным на шаге 1. Не забудьте вставить префикс перед токеном с Bearer

Ответ:

{
  "schemaVersion": 2,
  "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
  "manifests": [
    {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "size": 2825,
      "digest": "sha256:c8a1d8756ae34cdf361da263ed3f7ef98b7dc3718d5e445e8e6bd277989a4bde",
      "platform": {
        "architecture": "amd64",
        "os": "windows",
        "os.version": "10.0.16299.547"
      }
    }
  ]
}

Поле manifests[i].platform.os должно быть тем, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...