我在aws中创建了一个codebuild项目。现在我想构建一个docker容器并将其推送到ecr中。
我的buildspec.yaml简而言之是这样的:
version: 0.2
phases:
pre_build:
commands:
- $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email)
- COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
- IMAGE_TAG=${COMMIT_HASH:=latest}
build:
commands:
- DOCKER_BUILDKIT=1 docker build . -f docker/aws.Dockerfile -t $REPOSITORY_URI:latest --no-cache --build-arg NODE_ENV=${NODE_ENV}
- docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
post_build:
commands:
- docker push $REPOSITORY_URI:latest
问题是我想从存储在我的私人dockerhub帐户中的镜像开始。所以我的aws.Dockerfile以以下行开始:
FROM my-company/my-base:1.0
有什么方法可以恢复我的图像吗?我在buildspec.yaml中尝试过类似的东西
- DOCKER_LOGIN=$(aws secretsmanager get-secret-value --secret-id DOCKER_HUB_LOGIN --query SecretString --output text | jq -r '.username + ":" + .password')
- DOCKER_LOGIN_USER=$(aws secretsmanager get-secret-value --secret-id DOCKER_HUB_LOGIN --query SecretString --output text | jq -r '.username')
- echo $DOCKER_LOGIN | docker login --username $(echo $DOCKER_LOGIN_USER) --password-stdin
但我收到以下错误消息**来自守护程序的错误响应:获取“https://registry-1.docker.io/v2/“:未经授权:请输入您的用户名和密码,您的用户名和密码正确。
我猜我是想用这种方式登录ecr。
1条答案
按热度按时间qnyhuwrf1#
TL;DR看起来可能是你从哪个repo中拉取的时候弄混了。你已经登录了ECR,而你从DockerHub的www.example.com域名中拉取docker.io。
考虑一个docker镜像名称语法:
<domain>/<repository name>:<tag>
类似于如果你不传递标签,Docker会寻找
latest
标签,当你从DockerHub访问镜像时,你可以省略域名。这是因为DockerHub的docker.io是默认域名(即ubuntu:22.04
从DockerHub的docker.io拉取)。如果你想从ECR(或任何其他主机,不是DockerHub)拉取,你需要传递完整的镜像域,比如:
public.ecr.aws/ubuntu/ubuntu:22.04
或私有ECR存储库类似于<aws_account_id>.dkr.ecr.<availability_zone>.amazonaws.com/ubuntu:22.04
有了这些关于你的镜像在哪里的知识,你只需要登录到适当的主机,对于DockerHub,它会是这样的:
您可以将DockerHub凭据存储在SSM的参数存储中,以便在CodeBuild yaml中访问,如下所示: