我是terraform的新手,这个与docker的整个交易让我发疯,在过去的两天里,我一直在试图使terraform构建一个docker图像,尝试从头开始编写,这是可怕的和不直观的,所以我决定使用一些模块安东·巴班科写的,不用说,如果我在这里没有工作。
然后我尝试第三次重写整个东西,但使用一个带有PS命令的提供程序块来构建和推送映像,而不是依赖terraform来完成,这似乎总是失败。
provisioner "local-exec" {
interpreter = ["PowerShell", "-Command"]
command = <<EOF
aws ecr get-login-password | docker login https://${local.account_id}.dkr.ecr.${local.region}.amazonaws.com/v2/ -u AWS --password-stdin
cd docker
docker build -t ${local.image_name}:${local.image_tag} .
docker push ${local.image_name}:${local.image_tag}
EOF
}
}
当我单独尝试时:(是的,我的实际变量仅用于编辑个人信息,正确的信息存在于实际请求中)
aws ecr get-login-password | docker login https://*my actual account id*.dkr.ecr.*my actual region*.amazonaws.com/v2/ -u AWS --password-stdin
输出:
Error response from daemon: login attempt to https://*my actual accout id*.dkr.ecr.*my actual region*.amazonaws.com/v2/ failed with status: 400 Bad Request
AWS ECR返回正确的密码,但不知什么原因——password-stdin没有正确捕获它,有些东西坏了。
因为当我尝试:
aws ecr get-login-password | docker login https://*my actual account id*.dkr.ecr.*my actual region*.amazonaws.com/v2/ -u AWS -p *my actual pw*
输出:
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded
我也试过:
aws ecr get-login-password > pw.txt
cat ./pw.txt | docker login -u AWS --password-stdin *my actual account id*.dkr.ecr.*my actual region*.amazonaws.com
也返回400。
如果我只是把密码在代码中,它似乎工作和构建图像,但它不推它出于某种原因,我得到一个错误。Docker似乎是一个学习经验的下行螺旋…
编辑:我似乎误解了docker登录的使用,而不是图像名称,我应该传递一个repo url…愚蠢的我!
${local.image_name}
应:
${aws_ecr_repository.*my repo*.repository_url}
但不幸的是——password-stdin问题仍然存在。
解决!
解决方案:
我似乎已经明白了,我的方法是错误的。TF通过提供一个数据源来处理ecr验证令牌:data "aws_ecr_authorization_token" "token" {}
resource "null_resource" "local-image" {
triggers = {
js_file = filemd5(local.file_loc)
docker_file = filemd5(local.dockerfile_loc)
}
provisioner "local-exec" {
interpreter = ["PowerShell", "-Command"]
command = <<EOF
docker login ${data.aws_ecr_authorization_token.token.proxy_endpoint} -u AWS -p ${data.aws_ecr_authorization_token.token.password}
cd docker
docker build -t ${aws_ecr_repository.my-repo.repository_url}:${local.image_tag} .
docker push ${aws_ecr_repository.my-repo.repository_url}:${local.image_tag}
EOF
}
depends_on = [
data.aws_ecr_authorization_token.token
]
}
这可以完美地工作,并且data.aws_ecr_authorization_token.token.password
被设置为sensitive
并且从控制台输出中正确地编辑。