Получение образа из Amazon ECR с помощью docker-java

У меня возникла проблема с получением изображения из Amazon ECR с помощью клиента docker-java. Аутентификация входа в реестр ECR прошла успешно, но не удалось получить конкретный образ из репозитория. Странно то, что вход в ECR с помощью bash и извлечение образа с помощью докера работает.

Я использую библиотеку java-docker версии 3.0 (https://github.com/docker-java/docker-java/). Любая помощь в том, как отладить или решить эту проблему, будет полезна.

    // ECR client
    AmazonECRClient ecrClient = new AmazonECRClient(awsCredentialsProvider);
    GetAuthorizationTokenRequest getAuthTokenRequest = new GetAuthorizationTokenRequest();
    List<String> registryIds = new ArrayList<String>();
    registryIds.add("accountid");
    getAuthTokenRequest.setRegistryIds(registryIds);

    // Get Authorization Token
    GetAuthorizationTokenResult getAuthTokenResult = ecrClient.getAuthorizationToken(getAuthTokenRequest);
    AuthorizationData authData = getAuthTokenResult.getAuthorizationData().get(0);
    String userPassword = StringUtils.newStringUtf8(Base64.decodeBase64(authData.getAuthorizationToken()));
    String user = userPassword.substring(0, userPassword.indexOf(":"));
    String password = userPassword.substring(userPassword.indexOf(":")+1);

    DockerClientConfigBuilder config = new DockerClientConfigBuilder();
    config.withDockerHost("unix:///var/run/docker.sock");
    config.withDockerTlsVerify(false);
    config.withRegistryUsername(user);
    config.withRegistryPassword(password);
    config.withRegistryUrl(authData.getProxyEndpoint());
    config.build();

    DockerCmdExecFactory dockerCmdExecFactory = new DockerCmdExecFactoryImpl();
    //Docker client
    DockerClient dockerClient = DockerClientBuilder.getInstance(config)
        .withDockerCmdExecFactory(dockerCmdExecFactory)
    .build();

    // Response
    AuthResponse response = dockerClient.authCmd().exec();
    System.out.println(response.getStatus()); 

    // Pull image
    PullImageCmd pullImageCmd = dockerClient.pullImageCmd(respositoryname);
    pullImageCmd
        .exec(new PullImageResultCallback())
        .awaitSuccess(); 

Стандартный вывод:

    Login Succeeded
    Exception in thread "main" com.github.dockerjava.api.exception.DockerClientException: Could not pull image: unauthorized: authentication required

person Lokesh A. R.    schedule 18.10.2016    source источник


Ответы (2)


Вам нужно передать AuthConfig клиента в команду pull.

PullImageCmd pullImageCmd = dockerClient
    .pullImageCmd(respositoryname)
    .withAuthConfig(dockerClient.authConfig());
person John Zeringue    schedule 23.10.2016
comment
Я попробовал ваше предложение. Я получаю следующую ошибку: Исключение в потоке main com.github.dockerjava.api.exception.UnauthorizedException: Get registry-1.docker.io/v2/library/xyz_repository_name: unauthorized: неверное имя пользователя или пароль - person Lokesh A. R.; 01.11.2016
comment
Почти правильный ответ, мне тоже пришлось добавить имя репозитория: .withRepository (xyz_repository); - person Lokesh A. R.; 01.11.2016

Для меня проблема заключалась в том, что authData.getEndpointProxy () вернул URL-адрес с «https: //», но cmd извлечения изображения работает только без этого префикса, поэтому мне пришлось удалить его.

person Sebastian Jauert    schedule 08.10.2019