使用docker-java从Amazon ECR中提取图像

我正在使用docker-java客户端从Amazon ECR中拉取图像时遇到问题。 ECR注册loginvalidation成功,但无法从存储库中提取特定映像。 奇怪的是,login到ECR使用bash和拉图像使用docker工程。

我正在使用java版本的docker库( https://github.com/docker-java/docker-java/ )。 如何debugging或解决这个问题的任何帮助将是有用的。

// 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 

您需要将客户端的AuthConfig传递给pull命令。

 PullImageCmd pullImageCmd = dockerClient .pullImageCmd(respositoryname) .withAuthConfig(dockerClient.authConfig());