访问没有gcloud客户端的谷歌容器registry

我有一个CoreOSdocker主机,我想开始运行容器,但是当试图使用docker命令从谷歌容器私人registry( https://cloud.google.com/tools/container-registry/ ),我得到了一个403.我做了一些search,但我不知道如何附加身份validation(或在哪里生成用户+传递包与dockerlogin命令一起使用)。

有没有人有幸从谷歌的私人容器拉? 我不能安装gcloud命令,因为coreos没有附带python,这是一个要求

docker run -p 80:80 gcr.io/prj_name/image_name Unable to find image 'gcr.io/prj_name/image_name:latest' locally Pulling repository gcr.io/prj_name/image_name FATA[0000] HTTP code: 403 

更新 :从@mattmoor和@Jesse获得答案后:

我从中拉出的机器已经消失了

 curl -H 'Metadata-Flavor: Google' http://metadata.google.internal./computeMetadata/v1/instance/service-accounts/default/scopes https://www.googleapis.com/auth/bigquery https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/compute https://www.googleapis.com/auth/datastore ----> https://www.googleapis.com/auth/devstorage.read_only https://www.googleapis.com/auth/logging.admin https://www.googleapis.com/auth/sqlservice.admin https://www.googleapis.com/auth/taskqueue https://www.googleapis.com/auth/userinfo.email 

另外,我尝试使用_tokenlogin方法

 jenkins@riskjenkins:/home/andre$ ACCESS_TOKEN=$(curl -H 'Metadata-Flavor: Google' 'http://metadata.google.internal./computeMetadata/v1/instance/service-accounts/default/token' | cut -d'"' -f 4) % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 142 100 142 0 0 14686 0 --:--:-- --:--:-- --:--:-- 15777 jenkins@riskjenkins:/home/andre$ echo $ACCESS_TOKEN **************(redacted, but looks valid) jenkins@riskjenkins:/home/andre$ docker login -e not@val.id -u _token -p $ACCESS_TOKEN http://gcr.io Login Succeeded jenkins@riskjenkins:/home/andre$ docker run gcr.io/prj_name/image_name Unable to find image 'gcr.io/prj_name/image_name:latest' locally Pulling repository gcr.io/prj_name/image_name FATA[0000] HTTP code: 403 

Google容器registryvalidationscheme只是简单地使用:

 username: '_token' password: {oauth access token} 

在Google Compute Engine上,您可以在不使用 gcloud的情况下login:

 $ METADATA=http://metadata.google.internal./computeMetadata/v1 $ SVC_ACCT=$METADATA/instance/service-accounts/default $ ACCESS_TOKEN=$(curl -H 'Metadata-Flavor: Google' $SVC_ACCT/token \ | cut -d'"' -f 4) $ docker login -e not@val.id -u '_token' -p $ACCESS_TOKEN https://gcr.io 

{asia,eu,us,b} .gcr.io上的更新

要访问托pipe在本地化存储库中的存储库,您应该在上面的docker login命令中login到适当的主机名。

更新关于_token的引号

从docker版本1.8开始,dockerlogin需要-u选项以qoutes或以字母开头。

一些诊断技巧…

通过以下方式检查您是否拥有Cloud Storage范围:

 $ curl -H 'Metadata-Flavor: Google' $SVC_ACCT/scopes ... https://www.googleapis.com/auth/devstorage.full_control https://www.googleapis.com/auth/devstorage.read_write https://www.googleapis.com/auth/devstorage.read_only ... 

注意: “docker pull”需要“read_only”,但“docker push”需要“read_write”。

为了让这个机器人能够访问另一个项目中的存储桶,有几个步骤。

首先,通过以下方式找出VM服务帐户(又名机器人)的身份:

 $ curl -H 'Metadata-Flavor: Google' $SVC_ACCT/email 1234567890@developer.gserviceaccount.com 

接下来,有三个重要的ACL需要更新:

1)桶ACL(需要列出对象等)

 PROJECT_ID=correct-answer-42 ROBOT=1234567890@developer.gserviceaccount.com gsutil acl ch -u $ROBOT:R gs://artifacts.$PROJECT_ID.appspot.com 

2)桶默认ACL(将来的#3模板)

 gsutil defacl ch -u $ROBOT:R gs://artifacts.$PROJECT_ID.appspot.com 

3)对象ACL(只有当存储桶非空时才需要)

 gsutil -m acl ch -R -u $ROBOT:R gs://artifacts.$PROJECT_ID.appspot.com 

部分原因在于我们的官方文档还没有,我们需要一个更好的高层次的故事,但是我们尊重GCS ACL。

这里的答案涉及从Google Compute Engine实例中访问Docker。

如果您希望使用vanilla docker在不使用Google Compute Engine(即本地)的计算机上使用Google Container Registry,则可以按照Google的说明进行操作 。

两种主要方法是使用访问令牌或JSON密钥文件。

请注意, _token_json_key是您为用户名( -u )提供的实际值

访问令牌

 $ docker login -e 1234@5678.com -u _token -p "$(gcloud auth print-access-token)" https://gcr.io 

JSON密钥文件

 $ docker login -e 1234@5678.com -u _json_key -p "$(cat keyfile.json)" https://gcr.io 

要创build密钥文件,您可以按照以下说明进行操作:

  1. 打开凭证页面。
  2. 要设置新的服务帐户,请执行以下操作:
    • 点击添加凭据>服务帐户。
    • select是将服务帐户的公钥/私钥作为标准P12文件下载,还是作为可由Google API客户端库加载的JSON文件下载。
    • 您的新公钥/私钥对生成并下载到您的机器上; 它是这个键的唯一副本。 您有责任安全地存储它。

您可以在这里查看关于生成密钥文件的Google文档 。

有两种官方的方式 :

  1. $ docker login -e 1234@5678.com -u oauth2accesstoken -p "$(gcloud auth print-access-token)" https://gcr.io
  2. $ docker login -e 1234@5678.com -u _json_key -p "$JSON_KEY" https://gcr.io

注意:电子邮件没有使用,所以你可以把任何你想要的。

gcr.io更改为您在Google容器registry中显示的域名(例如eu.gcr.io )。

选项(1)只给出一个临时的标记,所以你可能需要选项(2)。 要得到那个$JSON_KEY

  1. 转到APIpipe理器>凭证
  2. 点击“创build凭证”> 服务帐户密钥
    • 服务帐号:新的服务帐号
      • 名称:任何你想要的,像Docker Registry (read-only)
      • angular色:存储(向下滚动)> 存储对象查看器
    • 键types: JSON
  3. 下载为keyfile.json
  4. JSON_KEY=$(cat keyfile.json | tr '\n' ' ')
  5. 现在你可以使用它。

一旦login,你可以运行docker pull 。 您也可以复制已更新的~/.dockercfg以保留设置。

当你创build你的虚拟机时,你是否给了它必要的范围,以便能够从registry中读取?

gcloud计算实例创buildINSTANCE \ –scopes https://www.googleapis.com/auth/devstorage.read_write

如果你这样做,不需要进一步的authentication。

有一个官方的Google容器registryauthentication插件发布。 欢迎您尝试并留下反馈/报告问题。

我开发了一个jenkins插件,允许在GCE上运行的slave用@ mattmoor的解决schemelogin到google的registry中。 这可能对其他人有用。 🙂

它可以在https://github.com/Byclosure/gcr.io-login-plugin上find