Google compute engine 不使用gcloud客户端访问google容器注册表
我有一个CoreOS docker主机,我想在它上面运行容器,但是当尝试使用docker命令从google容器私有注册表()获取图像时,我得到了一个403。我做了一些搜索,但我不确定如何附加身份验证(或者在何处生成要与docker login命令一起使用的user+pass捆绑包) 有没有人有幸从谷歌的私人容器中取出过?我无法安装gcloud命令,因为coreos不附带python,这是一项要求Google compute engine 不使用gcloud客户端访问google容器注册表,google-compute-engine,gcloud,google-container-registry,Google Compute Engine,Gcloud,Google Container Registry,我有一个CoreOS docker主机,我想在它上面运行容器,但是当尝试使用docker命令从google容器私有注册表()获取图像时,我得到了一个403。我做了一些搜索,但我不确定如何附加身份验证(或者在何处生成要与docker login命令一起使用的user+pass捆绑包) 有没有人有幸从谷歌的私人容器中取出过?我无法安装gcloud命令,因为coreos不附带python,这是一项要求 docker run -p 80:80 gcr.io/prj_name/image_name Una
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
此外,我还尝试使用_令牌登录方法
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容器注册表身份验证方案只需使用:
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
关于{亚洲、欧盟、美国、巴西}.gcr.io的更新
要访问本地化存储库中托管的存储库,您应该在上面的docker login
命令中登录到相应的主机名
更新令牌周围的引号
$ docker login -e 1234@5678.com -u _token -p "$(gcloud auth print-access-token)" https://gcr.io
从docker版本1.8开始,docker登录要求-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”要求“只读”,但“docker push”要求“读写”
要让这个机器人在另一个项目中访问一个桶,有几个步骤
首先,通过以下方式查找VM服务帐户(又名robot)的身份:
$ curl -H 'Metadata-Flavor: Google' $SVC_ACCT/email
1234567890@developer.gserviceaccount.com
接下来,需要更新三个重要的ACL:
1) Bucket ACL(需要列出对象等)
2) Bucket默认ACL(未来的模板#3)
3) 对象ACL(仅当bucket为非空时才需要)
我们的官方文档中还没有提到这一点的部分原因是我们想要一个更好的高层故事,但是tl;dr我们尊重GCS ACL。当您创建虚拟机时,是否为其提供了必要的作用域,以便能够从注册表中读取 gcloud计算实例创建实例\ --范围
如果您这样做了,就不需要进一步的身份验证。我开发了一个jenkins插件,允许运行在GCE上的从机使用@mattmoor的解决方案登录到google的注册表。它可能对其他人有用。:)
可以在。上找到。有一份官方出版物。欢迎您尝试,并留下反馈/报告问题。这里的答案涉及从Google计算引擎实例中访问docker 如果您想使用vanilla docker在不在Google计算引擎(即本地)中的机器上使用Google容器注册表,您可以 两种主要方法是使用访问令牌或JSON密钥文件 请注意,
\u token
和\u json\u 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
要创建密钥文件,可以按照以下说明操作:
- 单击添加凭据>服务帐户
- 选择是将服务帐户的公钥/私钥作为标准P12文件下载,还是作为可由Google API客户端库加载的JSON文件下载
- 生成新的公钥/私钥对并将其下载到您的计算机上;它是此密钥的唯一副本。您有责任将其安全存储
$docker登录-e1234@5678.com-u oauth2accesstoken-p“$(gcloud auth打印访问令牌)”https://gcr.io
$docker登录-e1234@5678.com-u_json_key-p“$json_key”https://gcr.io
gcr.io
更改为您的应用程序中显示的域(例如eu.gcr.io
)
选项(1)只提供一个临时标记,因此您可能需要选项(2)。要获取该$JSON_键
:
- 服务帐户:新的服务帐户
- 名称:任何您想要的,如
Docker注册表(只读)
- 角色:存储(向下滚动)>存储对象查看器
- 名称:任何您想要的,如
- 密钥类型:JSON
keyfile.json
JSON_KEY=$(cat keyfile.JSON|tr'\n'')
登录后,您可以运行
docker pull
。您也可以复制更新后的~/.dockercfg
以保留设置。这看起来很有希望,我明天会试一试。我们需要GCS读取范围才能使其工作。您可以使用:curl-H'Metadata Flavor:Google'/default/scopes检查这一点。GCE实例确实具有devstorage只读功能,尽管登录成功,但我无法提取映像。我编辑了原始问题,尝试了您和@Jesse的建议。如果您有任何其他建议,请告诉我您似乎有“http://gcr.io”您可以尝试https吗?我尝试使用https登录,但我遇到了相同的错误我不认为这是真的,因为“如果不提供此标志,则使用以下范围:,”我正在从repo退出,所以只读应该足够了,但是我仍然收到一封邮件,请不要只发布链接,因为链接可能会断开。谢谢,我会试试的。通过使用访问令牌登录到和端点,我能够使它达到足够好的状态。由于某种原因,我需要登录到both@Andre:您是否将Google容器注册表验证插件与Docker Build Step插件或其他插件一起使用?我也有点
$ docker login -e 1234@5678.com -u _token -p "$(gcloud auth print-access-token)" https://gcr.io
$ docker login -e 1234@5678.com -u _json_key -p "$(cat keyfile.json)" https://gcr.io