2016-10-18 41 views
1

我正在使用docker-java客户端从Amazon ECR中提取图像时遇到问题。 ECR注册登录身份验证成功,但无法从存储库中提取特定映像。奇怪的是,登录到ECR使用bash和使用码头工作拉图像。使用docker-java从Amazon ECR中提取图像

我正在使用3.0版本的java-docker库(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(); 

的stdout是:

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

回答

1

您需要将客户的AuthConfig到拉命令。

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

我试过了你的建议。我得到以下错误:线程“主”com.github.dockerjava.api.exception.UnauthorizedException异常:获取https://registry-1.docker.io/v2/library/xyz_repository_name:未授权:不正确的用户名或密码 –

+0

几乎正确的答案,我也必须添加repository_name:.withRepository(“xyz_repository”); –