身份验证方法

如需向 Container Registry 进行身份验证,建议您使用 gcloud 作为 Docker 凭据帮助程序,具体如下所述。

本页面还介绍了高级身份验证方法

准备工作

确保您已具备以下条件:

  1. 已经安装最新版本的 Cloud SDK,其中包括 gcloud 命令行工具

  2. 已经安装 Docker

gcloud Docker 凭据帮助程序

要向 Container Registry 进行身份验证,请使用 gcloud 作为 Docker 凭据帮助程序。为此,请运行以下命令:

gcloud auth configure-docker

向 Container Registry 进行身份验证需要运行一次此命令。

我们强烈建议您尽量使用这种方法。这样可确保在短时间内安全访问您的项目资源。

高级身份验证方法

本页上的高级方法只能在以下情况下使用:不适合以 gcloud 作为 Docker 凭据帮助程序,并且您已充分了解高级方法的安全隐患。

高级身份验证方法包括:

独立 Docker 凭据帮助程序

为推送和拉取映像,Docker 需要访问 Container Registry。您可以使用独立 Docker 凭据帮助程序工具 docker-credential-gcr 来配置要用于 Docker 的 Container Registry 凭据。

凭据帮助程序会自动或从其 --token-source 标志指定的位置提取 Container Registry 凭据,然后将凭据写入 Docker 的配置文件。这样,您就可以使用 Docker 的命令行工具 docker 与 Container Registry 直接互动。

要使用 Docker 凭证帮助程序,请执行以下操作:

  1. 通过以下两种方式之一下载 docker-credential-gcr

    • 使用 gcloud 命令行工具:

      gcloud components install docker-credential-gcr
      
    • docker-credential-gcrGitHub 版本中,可选择使用 curl 命令行实用程序。例如:

      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
      
  2. 将 Docker 配置为使用 Container Registry 凭据与 Container Registry 互动(您只需执行此操作一次):

    docker-credential-gcr configure-docker
    

    如需了解详情,请参阅 GitHub 上提供的 docker-credential-gcr 主文档

  3. 如果您打算使用 docker 命令来推送或拉取存储在其他 Google Cloud Platform 项目中的映像,请确保正确配置了权限和访问权限范围

gcloud docker

在将请求移交给 Docker 之前,请使用 gcloud docker 将 Container Registry 凭据添加到 Docker 客户端。例如,要推送相关摘要所标识的映像,请使用以下命令:

gcloud docker -- push [HOSTNAME]/[PROJECT-ID]/[IMAGE]@[IMAGE_DIGEST]

其中:

  • [HOSTNAME] 列在控制台的位置下方。可为以下四个选项之一:gcr.ious.gcr.ioeu.gcr.ioasia.gcr.io
  • [PROJECT-ID] 是您的 Google Cloud Platform Console 项目 ID。如果您的项目 ID 包含冒号 (:),请参阅网域级项目
  • [IMAGE] 是 Container Registry 映像的名称。
  • [IMAGE_DIGEST] 是映像内容的 sha256 哈希值。在控制台中,点击特定映像可查看其元数据。此摘要将被列为映像摘要

如需了解详情,请参阅 gcloud docker 文档

如果您打算使用 docker 命令来推送或拉取存储在其他 Google Cloud Platform 项目中的映像,请确保正确配置了权限和访问权限范围

访问令牌

访问令牌是短期有效的令牌,可提供对您的 Google Cloud Platform 资源的读写权限。

在对 Docker 命令进行身份验证时,gcloud docker 命令会以密码形式向 Container Registry 传递一个短期有效的访问令牌。

  • 对于 docker pulldocker search,访问令牌必须使用 devstorage.read_only 范围。
  • 对于 docker push,访问令牌必须使用 devstorage.read_write 范围。

如需详细了解推送和拉取映像所需的服务帐号权限和范围,请参阅将 Container Registry 与 Google Cloud Platform 搭配使用的要求

通过创建合适的访问令牌(例如 Compute Engine 实例元数据),您可以在没有 gcloud 命令行工具的情况下使用 gcloud docker 的身份验证方案。

此令牌授予的访问权限与使用 gcloud docker 命令进行身份验证时授予的访问权限相同,因此,此令牌是最安全的备用身份验证方法。

要使用访问令牌,请参阅应用默认凭据文档。然后使用以下凭据:

Linux/macOS

  • 用户名oauth2accesstoken
  • 密码是您的访问令牌。例如 gcloud auth print-access-token

例如:

gcloud auth print-access-token | docker login -u oauth2accesstoken --password-stdin https://[HOSTNAME]

其中,[HOSTNAME]gcr.ious.gcr.ioeu.gcr.ioasia.gcr.io

或者,对于不支持 --password-stdin 的旧版 Docker 客户端,请使用以下命令:

docker login -u oauth2accesstoken -p "$(gcloud auth print-access-token)" https://[HOSTNAME]

Windows

  • 用户名oauth2accesstoken
  • 密码gcloud auth print-access-token 的输出

例如:

gcloud auth print-access-token
ya29.8QEQIfY_...

docker login -u oauth2accesstoken -p "ya29.8QEQIfY_..." https://[HOSTNAME]

其中,[HOSTNAME]gcr.ious.gcr.ioeu.gcr.ioasia.gcr.io

JSON 密钥文件

服务帐号 JSON 密钥文件是一个长期有效的凭据,它仅适用于特定 GCP Console 项目及其资源。

如需与 Container Registry 交互,您必须为推送和拉取映像的服务帐号正确配置所需的权限和访问权限范围。

由 GCP 自动创建的服务帐号(例如 Container Registry 服务帐号)会被授予父级项目的 Editor 角色(具有读写权限)。Compute Engine 默认服务帐号配置为对同一项目中的存储空间具有只读访问权限。您可能希望向其他服务帐号授予更具体的权限。如需跨项目推送和拉取映像,您需要为与 Container Registry 交互的服务帐号正确配置权限和访问权限范围。

如需详细了解推送和拉取映像所需的服务帐号权限和范围,请参阅将 Container Registry 与 Google Cloud Platform 搭配使用的要求

如需使用 JSON 密钥文件,请按照 Google Cloud Platform Console 帮助中心中的服务帐号说明进行操作。然后使用以下凭据:

Linux/macOS

  • 用户名_json_key不是您的服务帐号名称)
  • keyfile.json 包含服务帐号 JSON 密钥

例如:

cat keyfile.json | docker login -u _json_key --password-stdin https://[HOSTNAME]

其中,[HOSTNAME]gcr.ious.gcr.ioeu.gcr.ioasia.gcr.io

或者,对于不支持 --password-stdin 的旧版 Docker 客户端,请使用以下命令:

docker login -u _json_key -p "$(cat keyfile.json)" https://[HOSTNAME]

Windows

  • 用户名_json_key不是您的服务帐号名称)
  • keyfile.json 包含服务帐号 JSON 密钥

例如:

set /p PASS=<keyfile.json
docker login -u _json_key -p "%PASS%" https://[HOSTNAME]

其中,[HOSTNAME]gcr.ious.gcr.ioeu.gcr.ioasia.gcr.io

请参阅服务帐号文档,详细了解如何配置服务帐号。

通过 GCP 使用 Container Registry

Compute Engine 实例和 Google Kubernetes Engine 集群可以根据实例上的 Cloud Storage 范围推送和拉取 Container Registry 映像。请参阅通过 GCP 使用 Container Registry

存储在 Container Registry 中的映像可以部署到 App Engine 柔性环境