Используем 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 потому что допустимые учетные данные не передаются узлу.
Я не получаю никакой ошибки. Я просто не знаю, как использовать API-интерфейс docker-java для добавления упомянутого флага. Искал документ и исходный код, но ничего не нашел.
Это нормально, если аутентификация реестра предоставляется в самом вашем объекте dockerClient?
Создание объекта DockerClient с помощью .withRegistryUsername(), .withRegistryPassword() ничего не изменило.
В чем была проблема с этими двумя вариантами, или у вас просто не вышло.
Вы пробовали все способы, упомянутые здесь github.com/docker-java/docker-java#программный, чтобы указать данные реестра.
Я сделал, команда работает. Служба создается, а затем происходит сбой, потому что она не может загрузить образ на моем узле. Я предполагаю, что данные аутентификации реестра не отправляются агентам роя, потому что флаг отсутствует.


Укажите данные аутентификации реестра в самом объекте dockerClient в вашем коде.
Проверьте это.
Если это не сработало. Сначала проверьте, верны ли данные аутентификации реестра, и попробуйте вручную извлечь образ Docker с помощью docker cli.
Поместите конфигурацию реестра в файл .docker/config.json и попробуйте загрузить образы докеров. А затем отследить проблемы.
Спасибо, docker cli работает, см. вопрос. Я думаю, что либо docker-java не предоставляет способ передать параметр/флаг, либо я не могу найти, как это сделать.
Что касается 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();
Пожалуйста, укажите, какие ошибки вы получаете с этим кодом.