排查容器映像问题

如果您在 Artifact Registry 中管理容器映像时遇到问题,不妨了解以下问题排查步骤。

无法拉取映像或部署到 Google Cloud 运行时环境

请检查以下各项:

  1. 验证您要推送的映像的完整路径是否正确。路径必须包含注册表主机名、Google Cloud 项目 ID、代码库和映像。例如:

    us-east1-docker.pkg.dev/my-project/my-repo/my-image:v1
    

    如需了解详情,请参阅代码库和映像名称

  2. 验证拉取映像的帐号是否具有从代码库读取映像的权限

    • Cloud Build 默认服务帐号对同一 Google Cloud 项目中的代码库拥有读取和写入权限。如果您使用的是用户提供的服务账号或跨项目推送和拉取映像,请向运行构建的服务帐号授予 Artifact Registry Writer 角色。
    • 默认情况下,Compute Engine、Cloud Run 和 Google Kubernetes Engine 对同一项目中的代码库拥有读取权限。如果 Artifact Registry 与运行时环境位于不同的项目中,您必须将 Artifact Registry Reader 角色授予运行时服务帐号。
    • 如果您使用的是 Docker 或其他第三方工具,则必须执行以下操作:

无法将映像推送到 Artifact Registry

请检查以下各项:

  1. 验证代码库是否存在。与 Container Registry 不同,创建代码库与推送第一个映像是不同的操作。如果该代码库不存在,请创建它。

  2. 验证您要推送的映像的完整路径是否正确。路径必须包含注册表主机名、Google Cloud 项目 ID、代码库和映像。例如:

    us-east1-docker.pkg.dev/my-project/my-repo/my-image:v1
    

    每个 Artifact Registry 代码库都是单独的资源,因此您无法将映像推送到没有代码库的路径。例如,us-east1-docker.pkg.dev/my-project/my-image:v1 是无效的映像路径。

    如需了解详情,请参阅代码库和映像名称

  3. 验证推送映像的帐号是否具有向代码库写入数据的权限

    • Cloud Build 默认服务帐号对同一 Google Cloud 项目中的代码库拥有读取和写入权限。如果您使用的是用户提供的服务账号或跨项目推送和拉取映像,请向运行构建的服务帐号授予 Artifact Registry Writer 角色。
    • 默认情况下,Compute Engine、Cloud Run 和 Google Kubernetes Engine 对同一项目中的代码库拥有读取权限。如果您在这些环境中使用第三方工具推送映像,则必须向运行时服务帐号授予 Artifact Registry Writer 角色。
  4. 如果 Artifact Registry 返回 The repository has enabled tag immutability 消息,则表示已为代码库配置了标记不可变性。如果映像的标记已被用于代码库中同一映像的另一个版本,则无法推送该映像。尝试使用其他已存储的映像版本未使用的标记再次推送该映像。

    如需验证代码库已配置为不可变的映像标记,请在 Google Cloud 控制台中查看代码库列表中的不可变的映像标记列,或运行以下命令:

    gcloud artifacts repositories describe REPOSITORY
        --project=PROJECT-ID
        --location=LOCATION
    

ImagePullBackOff 和 ErrImagePull 消息

包含 ImagePullBackOffErrImagePull 的消息表示 GKE 无法从注册表中拉取映像。