从AWS CodeBuild访问私有DockerHub存储库

gzszwxb4  于 2023-04-20  发布在  Docker
关注(0)|答案(1)|浏览(121)

我在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。

qnyhuwrf

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,它会是这样的:

echo $DOCKERHUB_PASSWORD | docker login --username foo --password-stdin`

您可以将DockerHub凭据存储在SSM的参数存储中,以便在CodeBuild yaml中访问,如下所示:

env:
  parameter-store:
    DOCKERHUB_PASSWORD: /qa/DOCKERHUB_PASSWORD

相关问题