AWS ECR使用JavaScript SDK登录--no-include-email标志

时间:2018-05-06 18:27:56

标签: amazon-web-services aws-sdk aws-ecr

我试图运行此AWS CLI命令:

aws ecr get-login --no-include-email --region <my-region>

但是使用JavaScript SDK和new AWS.ECR(..).getAuthorizationToken方法,但我收到此错误:

Error response from daemon: login attempt to https://xxxxx.dkr.ecr.<my-region>.amazonaws.com/v2/ failed with status: 400 Bad Request

根据我的理解,我需要在CLI命令中使用一些等于--no-include-email参数的标志,但我找不到如何使用JavaScript SDK设置它。

这是我的代码:

const ecr = new AWS.ECR({
    apiVersion: '2015-09-21',
    region: 'my-region'
});

const { authorizationData } = await ecr.getAuthorizationToken().promise();

if(!authorizationData || !authorizationData[0] || !authorizationData[0].authorizationToken){
    throw new Error('AWS getAuthorizationToken failed');
}

const password = authorizationData[0].authorizationToken;
const proxyEndpoint = authorizationData[0].proxyEndpoint;

await childProcessP.spawn('docker', [
    'login',
    '-u', 'AWS',
    '-p', password,
    proxyEndpoint
]);

有人知道怎么做吗?

3 个答案:

答案 0 :(得分:0)

使用(golang)docker ENGINE库我有同样的问题。

首先,我从ecr.GetAuthorizationToken()获得凭证(与您一样) 然后我打电话给docker.RegistryLogin()函数。

这是我的代码:

authToken, err  := ecrSession.GetAuthorizationToken(&ecr.GetAuthorizationTokenInput{})
    if err != nil {
        color.Red(fmt.Sprintf("Getting ECR auth token: %s", err.Error()))
        return err
    }

    auth := types.AuthConfig{
        Username: "AWS",
        Password: *authToken.AuthorizationData[0].AuthorizationToken,
        ServerAddress: *authToken.AuthorizationData[0].ProxyEndpoint,

    }

     authenticatedOK, err := cli.RegistryLogin(ctx, auth)

总是回复我 400错误请求

但是从shell运行命令:

aws ecr get-login --no-include-email --region eu-west-1

然后复制粘贴返回的输出

docker login -u AWS -p ... http://account-id.dkr.ecr.eu-west-1.amazonaws.com它运作正常。

答案 1 :(得分:0)

AuthorizationToken包含以base64编码的<username>:<password>

您需要做的就是解码并拆分以获取所需的值。

答案 2 :(得分:0)

我遇到了同样的问题,我在文档中发现authToken.AuthorizationData [0]中的令牌返回。AuthorizationToken是以64为基数的字符串。

因此,如果您要使用它登录Docker,则必须先对其进行解码。

解码后,您将看到类似这样的内容:AWS:eyJwYXlsb2FkIjoiZGhtVzc5Sj ....

事实证明令牌是由用户编码的。因此,您必须取出AWS:并使用剩余字符串。