Docker-java эквивалент «docker service create --with-registry-auth»

Используем https://github.com/докер-java/докер-java и ищем способ добавить опцию --with-registry-auth из https://docs.docker.com/v17.12/engine/reference/commandline/service_create/#options

val createCmd = dockerClient.createServiceCmd(
                ServiceSpec()
                        .withName("name")

                        .withTaskTemplate(TaskSpec()
                                .withContainerSpec(ContainerSpec()
                                        .withEnv(envs)
                                        .withImage("image")
                                        .withMounts(mounts)
                                )
                                .withNetworks(networks)
                                .withPlacement(ServicePlacement()
                                        .withConstraints(constraints))
                        )
        )

Чтобы уточнить это больше:

Я ищу способ docker-java для выполнения этой команды (это работает!):

docker service create --with-registry-auth --constraint 'node.labels.mynodeid==7' myprivateregistry.foo:5000/imagename:latest

Удаление --with-registry-auth вот так

docker service create --constraint 'node.labels.mynodeid==7' myprivateregistry.foo:5000/imagename:latest

выдаст эту ошибку: No such image: myprivateregistry.foo:5000/imagename:latest потому что допустимые учетные данные не передаются узлу.

Пожалуйста, укажите, какие ошибки вы получаете с этим кодом.

mchawre 21.06.2019 17:47

Я не получаю никакой ошибки. Я просто не знаю, как использовать API-интерфейс docker-java для добавления упомянутого флага. Искал документ и исходный код, но ничего не нашел.

TomGrill Games 21.06.2019 17:49

Это нормально, если аутентификация реестра предоставляется в самом вашем объекте dockerClient?

mchawre 21.06.2019 17:52

Создание объекта DockerClient с помощью .withRegistryUsername(), .withRegistryPassword() ничего не изменило.

TomGrill Games 21.06.2019 17:56

В чем была проблема с этими двумя вариантами, или у вас просто не вышло.

mchawre 21.06.2019 17:58

Вы пробовали все способы, упомянутые здесь github.com/docker-java/docker-java#программный, чтобы указать данные реестра.

mchawre 21.06.2019 18:02

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

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

Ответы 2

Укажите данные аутентификации реестра в самом объекте dockerClient в вашем коде.

Проверьте это.

Если это не сработало. Сначала проверьте, верны ли данные аутентификации реестра, и попробуйте вручную извлечь образ Docker с помощью docker cli.

Поместите конфигурацию реестра в файл .docker/config.json и попробуйте загрузить образы докеров. А затем отследить проблемы.

Спасибо, docker cli работает, см. вопрос. Я думаю, что либо docker-java не предоставляет способ передать параметр/флаг, либо я не могу найти, как это сделать.

TomGrill Games 21.06.2019 18:32
Ответ принят как подходящий

Что касается docker-java 3.2.0-rc5, теперь вы можете указать authConfig для извлечения изображений из частного реестра.

        AuthConfig authConfig = new AuthConfig()
                .withUsername("testuser")
                .withPassword("testpassword")
                .withEmail("[email protected]")
                .withRegistryAddress("your.registry.address.here");

        dockerClient.createServiceCmd(new ServiceSpec()
                .withName(SERVICE_NAME)
                .withTaskTemplate(new TaskSpec()
                        .withContainerSpec(new ContainerSpec()
                                .withImage(DEFAULT_IMAGE))))
                .withAuthConfig(authConfig)
                .exec();

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