在没有 gcloud 客户端的情况下访问 google 容器注册表
Access google container registry without the gcloud client
我有一个 CoreOS docker 主机,我想在其上启动 运行 容器,但是当我尝试使用 docker 命令从 google 容器私有注册表(https://cloud.google.com/tools/container-registry/),我得到一个 403。我做了一些搜索,但我不确定如何附加身份验证(或在哪里生成用户+密码包以与 docker登录命令)。
有没有人从 google 私有容器中取出任何运气?我无法安装 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
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 登录要求 -u 选项出现在引号中或以字母开头。
一些诊断技巧...
通过以下方式检查您是否拥有云存储范围:
$ 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) 存储桶默认 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。
当您创建 VM 时,是否为它提供了必要的范围以便能够从注册表中读取?
gcloud compute instances create INSTANCE \
--scopes https://www.googleapis.com/auth/devstorage.read_write
如果您这样做了,则不需要进一步的身份验证。
我开发了一个 jenkins 插件,它允许 GCE 上的从 运行 使用@mattmoor 的解决方案登录 google 的注册表。它可能对其他人有用。 :)
官方Google Container Registry Auth Plugin发布了。欢迎您试用并留下 feedback/report 个问题。
此处的答案涉及从 Google Compute Engine 实例中访问 docker。
如果您想在不在 Google Compute Engine(即本地)的机器上使用普通 docker 使用 Google Container Registry,您可以 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
要创建密钥文件,您可以按照以下说明操作:
- 打开凭据页面。
- 要设置新的服务帐户,请执行以下操作:
- 单击“添加凭据”>“服务帐户”。
- 选择是将服务帐户的 public/private 密钥下载为标准 P12 文件,还是下载为可由 Google API 客户端加载的 JSON 文件图书馆。
- 您的新 public/private 密钥对已生成并下载到您的计算机;它作为此密钥的唯一副本。您有责任安全地存储它。
你可以view Google's documentation on generating a key file here.
$ 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" > 服务帐户密钥:
- 服务帐号:新服务帐号
- 姓名:任何你想要的,比如
Docker Registry (read-only)
- 角色:存储(向下滚动)> 存储对象查看器
- 密钥类型:JSON
- 下载为
keyfile.json
JSON_KEY=$(cat keyfile.json | tr '\n' ' ')
- 现在可以使用了。
登录后您可以 运行 docker pull
。您还可以复制更新后的 ~/.dockercfg
以保留设置。
我有一个 CoreOS docker 主机,我想在其上启动 运行 容器,但是当我尝试使用 docker 命令从 google 容器私有注册表(https://cloud.google.com/tools/container-registry/),我得到一个 403。我做了一些搜索,但我不确定如何附加身份验证(或在哪里生成用户+密码包以与 docker登录命令)。
有没有人从 google 私有容器中取出任何运气?我无法安装 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
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 登录要求 -u 选项出现在引号中或以字母开头。
一些诊断技巧...
通过以下方式检查您是否拥有云存储范围:
$ 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) 存储桶默认 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。
当您创建 VM 时,是否为它提供了必要的范围以便能够从注册表中读取?
gcloud compute instances create INSTANCE \ --scopes https://www.googleapis.com/auth/devstorage.read_write
如果您这样做了,则不需要进一步的身份验证。
我开发了一个 jenkins 插件,它允许 GCE 上的从 运行 使用@mattmoor 的解决方案登录 google 的注册表。它可能对其他人有用。 :)
官方Google Container Registry Auth Plugin发布了。欢迎您试用并留下 feedback/report 个问题。
此处的答案涉及从 Google Compute Engine 实例中访问 docker。
如果您想在不在 Google Compute Engine(即本地)的机器上使用普通 docker 使用 Google Container Registry,您可以 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
要创建密钥文件,您可以按照以下说明操作:
- 打开凭据页面。
- 要设置新的服务帐户,请执行以下操作:
- 单击“添加凭据”>“服务帐户”。
- 选择是将服务帐户的 public/private 密钥下载为标准 P12 文件,还是下载为可由 Google API 客户端加载的 JSON 文件图书馆。
- 您的新 public/private 密钥对已生成并下载到您的计算机;它作为此密钥的唯一副本。您有责任安全地存储它。
你可以view Google's documentation on generating a key file here.
$ 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" > 服务帐户密钥:
- 服务帐号:新服务帐号
- 姓名:任何你想要的,比如
Docker Registry (read-only)
- 角色:存储(向下滚动)> 存储对象查看器
- 姓名:任何你想要的,比如
- 密钥类型:JSON
- 服务帐号:新服务帐号
- 下载为
keyfile.json
JSON_KEY=$(cat keyfile.json | tr '\n' ' ')
- 现在可以使用了。
登录后您可以 运行 docker pull
。您还可以复制更新后的 ~/.dockercfg
以保留设置。