Используйте Spring Native с пользовательским реестром Docker

Мы экспериментируем с Spring Native, следуя их гид. Кроме того, мы хотим использовать Gradle и Сборки. Мы соответствующим образом адаптировали нашу конфигурацию (build.gradle) и запустили ./gradlew bootBuildImage, чтобы создать образ Spring Native.

Проблема возникает из-за того, что мы вынуждены использовать собственный реестр образов Docker нашей компании. Поэтому мы не можем напрямую вытащить e. грамм. docker.io/paketobuildpacks/run:tiny-cnb, но нужно использовать что-то вроде docker-io.docker-proxy.ourcompany.com/paketobuildpacks/run:tiny-cnb.

Мы уже извлекли и повторно пометили образ строителя paketobuildpacks/builder, который использовался в процессе. Но поскольку все остальное происходит внутри этого контейнера сборки, мы не можем использовать это решение дальше. Итак, мы получаем:

* What went wrong:
Execution failed for task ':bootBuildImage'.
> Docker API call to 'localhost/v1.24/images/create?fromImage=docker.io%2Fpaketobuildpacks%2Frun%3Atiny-cnb' failed with status code 500 "Internal Server Error" and message "Get "https://registry-1.docker.io/v2/": context deadline exceeded"

(Возможно, потому что попытка подключения к *.docker.io просто истечет по тайм-ауту.)

На данный момент мы не нашли возможности настроить реестр Docker, используемый процессом. Мы также могли бы найти большее «дерево» дополнительных зависимостей, необходимых позже в процессе, описанных в таких файлах, как здесь (где gcr.io упоминается вместо docker.io).

Нам никоим образом не будет позволено получить прямой доступ к публичным реестрам и, таким образом, не будет никаких дальнейших идей. Итак, можете ли вы придумать какую-либо разумную возможность для достижения нашей цели по созданию образа Spring Native с использованием ваших собственных реестров прокси?

Спасибо заранее!

Вы проверяли официальную документацию docs.docker.com/network/proxy?

Sergio Santiago 03.05.2022 08:07

@SergioSantiago, спасибо, да, мы думали об этом решении. Но нам не хватает не прокси, а пользовательского реестра «перенаправление». Попытка войти в реестр нашей компании в качестве прокси-сервера в упомянутой конфигурации ничего не изменила. (Кроме того, для правильной работы реестр нашей компании должен быть доступен через имя хоста... :( )

ahuemmer 03.05.2022 08:18
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
2
2
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

С помощью pack cli вы можете запустить pack config registry-mirrors add <registry> [-m <mirror...] [flags], например: pack config registry-mirrors add index.docker.io --mirror 10.0.0.1, где 10.0.0.1 — ваш личный реестр.

https://buildpacks.io/docs/tools/pack/cli/pack_config_registry-mirrors_add/

В поддержке Spring Boot Gradle у вас есть настройки docker.builderRegistry и docker.publishRegistry, но они в основном используются для предоставления учетных данных, которые будут использоваться для извлечения или публикации изображений из реестра. Они не совсем делают то, что нам здесь нужно.

https://docs.spring.io/spring-boot/docs/2.6.7/gradle-plugin/reference/htmlsingle/#build-image.docker-registry

Поддержка зеркальных функций, как в pack cli, в настоящее время невозможна. проблема была открыта для отслеживания поддержки этого, так что, надеюсь, он будет доступен в будущем выпуске.

А пока вы можете использовать pack cli с опцией зеркала выше для создания изображений.

Быстрый способ проверить/подтвердить:

  1. Беги docker run -d -p 5000:5000 --restart=always --name=registry -e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io registry:2. Это запустит локальный реестр, который зеркала Docker Hub.

  2. Запустите pack config registry-mirrors add '*' --mirror localhost:5000, чтобы указать pack cli использовать зеркало реестра.

  3. Запустите pack build против вашего приложения. Вы должны увидеть вывод, например:

Using mirror localhost:5000/paketobuildpacks/builder:base for index.docker.io/paketobuildpacks/builder:base
base: Pulling from paketobuildpacks/builder
83525de54a98: Pulling fs layer
807f554cf05f: Pulling fs layer
...

Если вы видите эту линию, вы знаете, что она работает правильно.

Вы также должны увидеть это в своей конфигурации pack:

> cat ~/.pack/config.toml
[registry-mirrors]
  "*" = "localhost:5000"

Это означает, что у вас правильно настроено зеркало реестра.

Спасибо, @Daniel Mikusa, но у этого решения есть два недостатка. :( Блок в build.gradle действительно заставляет загрузить образ билдера из нашего кастомного реестра. Но потом я получаю: Execution failed for task ':bootBuildImage'. > Run image 'docker.io/paketobuildpacks/run:tiny-cnb' must be pulled from the 'docker-io.docker-proxy.ourcompany.com' authenticated registry. Чего я не понимаю, потому что именно это и произошло, я даже могу потом найти образ с помощью docker images (после предварительно обрезав систему Docker).

ahuemmer 03.05.2022 15:04

Мы также думали о решении для пакета cli, но нам нужно было бы применить этот параметр в пределах к контейнеру сборки, а в этом образе билдера нет пакета cli. :(

ahuemmer 03.05.2022 15:05

И еще одно дополнение: исключение gradle из моего первого комментария встречается только в сочетании с bootBuildImage {builder = "docker-remote-docker-io.artifacts.ruv.de/paketobuildpacks/b‌​uilder:tiny"} в нашем build.gradle. Если я удалю этот параметр, процесс завершится ошибкой из-за того, что снова не будет достигнуто docker.io.

ahuemmer 03.05.2022 15:16

Хм, мне придется спросить о конфигурации Gradle. Я пошел на тест, и мне потребовались кредиты, даже если наш внутренний кеш докеров не защищен паролем. Что касается pack cli, вы должны иметь возможность использовать в конструкторе то, что вам не нужно. Вам просто нужен пакет cli на вашей сборочной машине, практически везде, где вы запускаете ./gradlew bootBuildImage. Вместо того, чтобы бежать ./gradlew bootBuildImage, вы бежите pack build.

Daniel Mikusa 03.05.2022 18:06

Извините за опоздание с ответом! Я также столкнулся с проблемой учетных данных, но смог обойти ее, используя некоторые действительные учетные данные. Я также попробовал ваше решение с помощью pack config..., но проблема сохраняется без каких-либо изменений при его использовании. :(

ahuemmer 04.05.2022 16:55

Я обновил это, добавив несколько заметок о поддержке Spring Boot. Я не думаю, что это будет работать так, как сейчас, но сейчас открыта проблема, чтобы поддержать это. Что касается пакета, я добавил больше деталей в свой ответ. Эти шаги должны работать. Я проверил их и предоставил шаги для тестирования/проверки. Если вам не повезло с пакетом, я бы посоветовал вам открыть новый вопрос, поскольку этот вопрос был направлен на поддержку Spring Boot. Не стесняйтесь упоминать меня в этом вопросе.

Daniel Mikusa 05.05.2022 02:06

Спасибо за терпение и профессиональную помощь! Я не могу попробовать это до следующей недели, но, как вы сказали, это в основном проблема Spring Boot, поэтому я считаю, что мой вопрос решен.

ahuemmer 05.05.2022 06:45

Другие вопросы по теме