无法推送到 Google Container Registry(拒绝访问)
Unable to Push to Google Container Registry (access denied)
当我尝试 push a container image 到 Container Registry 时,它给了我以下错误,
denied: Token exchange failed for project 'my-proj-123'. Caller does not have permission 'storage.buckets.create'. To configure permissions, follow instructions at: https://cloud.google.com/container-registry/docs/access-control
我必须遵循 Bucket Name Verification 流程才能创建 artifacts.my-proj-123.appspot.com
存储桶。现在,当我尝试推送 docker 图像时,它不会抱怨 storage.buckets.create
权限,而只会给出:
denied: Access denied.
我不知道我需要授予哪个用户访问权限。我授予 Storage Admin 对 Compute Engine 默认服务帐户 的访问权限,但无济于事。我该如何解决?
我能够将 Docker 映像从 Container Optimized OS 推送到 Container Registry。
如果您遇到权限问题,我建议您至少授予 Compute Engine 默认服务帐户 项目编辑器权限,仅用于测试目的。即使您只针对 Cloud Storage,流程的其他部分也可能需要更多权限。完成测试后,您可以创建一个权限较少的新服务帐户,并根据您的需要对其进行微调。
另外,authentication 有一个替代 gcloud
的方法。您可以按照以下方法尝试:
首先尝试下载 docker-credential-gcr:
VERSION=1.5.0
OS=linux # or "darwin" for OSX, "windows" for Windows.
ARCH=amd64 # or "386" for 32-bit OSs
curl -fsSL "https://github.com/GoogleCloudPlatform/docker-credential-gcr/releases/download/v${VERSION}/docker-credential-gcr_${OS}_${ARCH}-${VERSION}.tar.gz" \
| tar xz --to-stdout ./docker-credential-gcr \
> /usr/bin/docker-credential-gcr && chmod +x /usr/bin/docker-credential-gcr
之后执行docker-credential-gcr configure-docker
下载 Compute Engine 默认服务帐户 json key。
执行cat [your_service_account_credentials.json] | docker login -u _json_key --password-stdin https://[HOSTNAME]
我在尝试从容器优化 OS 将 docker 图像上传到 GCR 时遇到了类似的问题,我 运行 以下命令序列,
- 创建了服务帐户并分配了存储管理员权限。
- 下载了 JSON 密钥
- 已执行
docker-credential-gcr configure-docker
- 使用 docker 命令登录 -
docker login -u _json_key -p "$(cat ./mygcrserviceaccount.JSON)" https://gcr.io
- 尝试推送图像 gcr -
docker push gcr.io/project-id/imagename:tage01
失败并出现以下错误,
denied: Token exchange failed for project 'project-id'. Caller does not have permission 'storage.buckets.create'. To configure permissions, follow instructions at: https://cloud.google.com/container-registry/docs/access-control
我尝试通过 IAM 角色向我的服务帐户授予所有可能的权限,但它会失败并出现相同的错误。
阅读这篇文章后 issue 我做了以下更改,
- 删除了 docker 配置目录
rm -rf ~/.docker
- 已执行
docker-credential-gcr configure-docker
- 将 JSON 密钥存储到名为 GOOGLE_APPLICATION_CREDENTIALS 的变量中
GOOGLE_APPLICATION_CREDENTIALS=/path/to/mygcrserviceaccount.JSON
使用 docker 命令登录 - docker login -u _json_key -p "$(cat ${GOOGLE_APPLICATION_CREDENTIALS})" https://gcr.io
执行了docker推送命令-docker push gcr.io/project-id/imagename:tage01
瞧,它很有魅力!
当我尝试 push a container image 到 Container Registry 时,它给了我以下错误,
denied: Token exchange failed for project 'my-proj-123'. Caller does not have permission 'storage.buckets.create'. To configure permissions, follow instructions at: https://cloud.google.com/container-registry/docs/access-control
我必须遵循 Bucket Name Verification 流程才能创建 artifacts.my-proj-123.appspot.com
存储桶。现在,当我尝试推送 docker 图像时,它不会抱怨 storage.buckets.create
权限,而只会给出:
denied: Access denied.
我不知道我需要授予哪个用户访问权限。我授予 Storage Admin 对 Compute Engine 默认服务帐户 的访问权限,但无济于事。我该如何解决?
我能够将 Docker 映像从 Container Optimized OS 推送到 Container Registry。
如果您遇到权限问题,我建议您至少授予 Compute Engine 默认服务帐户 项目编辑器权限,仅用于测试目的。即使您只针对 Cloud Storage,流程的其他部分也可能需要更多权限。完成测试后,您可以创建一个权限较少的新服务帐户,并根据您的需要对其进行微调。
另外,authentication 有一个替代 gcloud
的方法。您可以按照以下方法尝试:
首先尝试下载 docker-credential-gcr:
VERSION=1.5.0 OS=linux # or "darwin" for OSX, "windows" for Windows. ARCH=amd64 # or "386" for 32-bit OSs curl -fsSL "https://github.com/GoogleCloudPlatform/docker-credential-gcr/releases/download/v${VERSION}/docker-credential-gcr_${OS}_${ARCH}-${VERSION}.tar.gz" \ | tar xz --to-stdout ./docker-credential-gcr \ > /usr/bin/docker-credential-gcr && chmod +x /usr/bin/docker-credential-gcr
之后执行
docker-credential-gcr configure-docker
下载 Compute Engine 默认服务帐户 json key。
执行
cat [your_service_account_credentials.json] | docker login -u _json_key --password-stdin https://[HOSTNAME]
我在尝试从容器优化 OS 将 docker 图像上传到 GCR 时遇到了类似的问题,我 运行 以下命令序列,
- 创建了服务帐户并分配了存储管理员权限。
- 下载了 JSON 密钥
- 已执行
docker-credential-gcr configure-docker
- 使用 docker 命令登录 -
docker login -u _json_key -p "$(cat ./mygcrserviceaccount.JSON)" https://gcr.io
- 尝试推送图像 gcr -
docker push gcr.io/project-id/imagename:tage01
失败并出现以下错误,
denied: Token exchange failed for project 'project-id'. Caller does not have permission 'storage.buckets.create'. To configure permissions, follow instructions at: https://cloud.google.com/container-registry/docs/access-control
我尝试通过 IAM 角色向我的服务帐户授予所有可能的权限,但它会失败并出现相同的错误。
阅读这篇文章后 issue 我做了以下更改,
- 删除了 docker 配置目录
rm -rf ~/.docker
- 已执行
docker-credential-gcr configure-docker
- 将 JSON 密钥存储到名为 GOOGLE_APPLICATION_CREDENTIALS 的变量中
GOOGLE_APPLICATION_CREDENTIALS=/path/to/mygcrserviceaccount.JSON
使用 docker 命令登录 -
docker login -u _json_key -p "$(cat ${GOOGLE_APPLICATION_CREDENTIALS})" https://gcr.io
执行了docker推送命令-
docker push gcr.io/project-id/imagename:tage01
瞧,它很有魅力!