我试图运行此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
]);
有人知道怎么做吗?
答案 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:并使用剩余字符串。