在没有gcloud客户端的情况下访问谷歌容器注册表

时间:2015-03-27 00:58:24

标签: google-compute-engine gcloud google-container-registry

我有一个CoreOS docker主机,我想开始运行容器,但是当我尝试使用docker命令从google容器私有注册表(https://cloud.google.com/tools/container-registry/)获取图像时,我得到了403.I做了一些搜索,但我不确定如何附加身份验证(或者在哪里生成用户+ pass bundle以与docker login命令一起使用)。

有没有人从谷歌私人容器中抽出任何运气?我无法安装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获得答案后:

我要拉的机器确实有devaccess

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

此外,我尝试使用_token登录方法

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

6 个答案:

答案 0 :(得分:45)

Google Container Registry身份验证方案只需使用:

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

在Google Compute Engine上,您可以使用

登录不带 gcloud
$ 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

要访问托管在本地化存储库中的存储库,您应该在上面的docker login命令中登录相应的主机名。

围绕_token

的报价更新

自docker版本1.8起,docker login需要-u选项为qoutes或以字母开头。

一些诊断提示......

通过以下方式检查您是否具有云存储范围:

$ 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)Bucket ACL(需要列出对象等)

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

2)Bucket默认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

为什么这不在我们的官方文档中,部分原因是我们想要一个更好的高级故事,但是tl; dr我们尊重GCS ACL。

答案 1 :(得分:18)

此处的答案涉及从Google Compute Engine实例中访问docker。

如果您想使用vanilla docker在不在Google Compute Engine(即本地)的计算机上使用Google容器注册表,您可以follow Google's instructions

两种主要方法是使用访问令牌或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

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

  1. 打开“凭据”页面。
  2. 要设置新的服务帐户,请执行以下操作:
    • 点击添加凭据>服务帐户。
    • 选择是将服务帐户的公钥/私钥下载为标准P12文件,还是将其作为可由Google API客户端库加载的JSON文件。
    • 您的新公钥/私钥对已生成并下载到您的计算机上;它是此密钥的唯一副本。您有责任安全地存储它。
  3. 你可以view Google's documentation on generating a key file here

答案 2 :(得分:5)

two official ways

  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
  3. 注意:未使用电子邮件,因此您可以随意添加任何内容。

    gcr.io更改为Google Container Registry中显示的域名(例如eu.gcr.io)。

    选项(1)仅提供临时令牌,因此您可能需要选项(2)。获得$JSON_KEY

    1. 转到API Manager > Credentials
    2. 点击"创建凭据" > 服务帐户密钥
      • 服务帐户:新服务帐户
        • 姓名:您想要的任何内容,例如Docker Registry (read-only)
        • 角色:存储(向下滚动)> 存储对象查看器
      • 键类型: JSON
    3. 下载为keyfile.json
    4. JSON_KEY=$(cat keyfile.json | tr '\n' ' ')
    5. 现在你可以使用它。
    6. 登录后,您只需运行docker pull即可。您还可以复制更新的~/.dockercfg以保留设置。

答案 3 :(得分:1)

当您创建VM时,您是否为其提供了必要的范围以便能够从注册表中读取?

  

gcloud计算实例创建INSTANCE \       --scopes https://www.googleapis.com/auth/devstorage.read_write

如果您这样做,则无需进一步验证。

答案 4 :(得分:0)

有一位官员Google Container Registry Auth Plugin已发布。欢迎您尝试并留下反馈/报告问题。

答案 5 :(得分:-1)

我开发了一个jenkins插件,允许在GCE上运行的奴隶使用@ mattmoor的解决方案登录谷歌的注册表。它可能对其他人有用。 :)

可在https://github.com/Byclosure/gcr.io-login-plugin处找到。