我有一个CoreOS docker主机,我想开始运行容器,但是当我尝试使用docker命令从google容器私有注册表(https://cloud.google.com/tools/container-registry/)获取图像时,我得到403.我做了一些搜索,但我'我不知道如何附加身份验证(或生成用户传递包以与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
Update :从@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 回答
我开发了一个jenkins插件,允许运行在GCE上的奴隶使用@ mattmoor的解决方案登录谷歌的注册表 . 它可能对其他人有用 . :)
它可以在https://github.com/Byclosure/gcr.io-login-plugin获得 .
Google Container Registry身份验证方案仅用于:
在Google Compute Engine上,您可以使用以下命令登录 without gcloud:
Update on {asia,eu,us,b}.gcr.io
要访问托管在本地化存储库中的存储库,您应该在上面的
docker login
命令中登录相应的主机名 .Update on quotes around _token
从docker版本1.8开始,docker login需要-u选项为qoutes或以字母开头 .
Some diagnostic tips...
通过以下方式检查您是否拥有 Cloud 存储范围:
NOTE: "docker pull"需要"read_only",但"docker push"需要"read_write" .
要让此机器人访问另一个项目中的存储桶,可以执行几个步骤 .
首先,通过以下方式找出VM服务帐户(aka robot)的身份:
接下来,有三个重要的ACL要更新:
1)存储区ACL(列出对象等所需)
2)Bucket默认ACL(未来#3的模板)
3)对象ACL(仅当存储桶非空时才需要)
部分原因不在于我们的官方文档,我们想要一个更好的高级故事,但是tl; dr我们尊重GCS ACL .
这里的答案涉及从Google Compute Engine实例中访问docker .
如果您想使用vanilla docker在不在Google Compute Engine(即本地)的计算机上使用Google容器注册表,您可以follow Google's instructions .
两种主要方法是使用访问令牌或JSON密钥文件 .
请注意
_token
和_json_key
是您为用户名提供的实际值(-u
)Access Token
JSON Key File
要创建密钥文件,您可以按照以下说明操作:
打开“凭据”页面 .
要设置新的服务帐户,请执行以下操作:
单击添加凭据>服务帐户 .
选择是将服务帐户的公钥/私钥下载为标准P12文件,还是作为可由Google API客户端库加载的JSON文件 .
您的新公钥/私钥对已生成并下载到您的计算机上;它是此密钥的唯一副本 . 您有责任安全地存储它 .
你可以view Google's documentation on generating a key file here .
有two official ways:
$ docker login -e 1234@5678.com -u oauth2accesstoken -p "$(gcloud auth print-access-token)" https://gcr.io
$ docker login -e 1234@5678.com -u _json_key -p "$JSON_KEY" https://gcr.io
注意:未使用电子邮件,因此您可以将任何内容放入其中 .
将
gcr.io
更改为Google Container Registry中显示的域名(例如eu.gcr.io
) .选项(1)仅提供临时令牌,因此您可能需要选项(2) . 要得到
$JSON_KEY
:转到API Manager > Credentials
单击"Create credentials"> Service account key :
服务帐户:新服务帐户
姓名:你想要的任何东西,比如
Docker Registry (read-only)
角色:存储(向下滚动)> Storage Object Viewer
键类型: JSON
下载为
keyfile.json
JSON_KEY=$(cat keyfile.json | tr '\n' ' ')
现在你可以使用它了 .
登录后,您只需运行
docker pull
即可 . 您还可以复制更新的~/.dockercfg
以保留设置 .在创建VM时,您是否为其提供了必要的范围,以便能够从注册表中读取?
如果您这样做,则无需进一步的身份验证 .
有一个官方Google Container Registry Auth Plugin出版 . 欢迎您尝试并留下反馈/报告问题 .