33

我有一个 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

更新:从@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
4

6 回答 6

54

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 中或以字母开头。

一些诊断技巧...

通过以下方式检查您是否具有 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(仅当bucket非空时才需要)

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

这还没有出现在我们的官方文档中的部分原因是我们想要一个更好的高级故事,但是我们尊重 GCS ACL。

于 2015-03-27T22:36:17.953 回答
18

这里的答案涉及从 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

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

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

您可以在此处查看 Google 关于生成密钥文件的文档

于 2015-11-18T04:21:28.987 回答
5

官方有两种方式

  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

注意:电子邮件没有被使用,所以你可以在里面放任何你想要的东西。

更改为您的Google 容器注册表gcr.io中显示的任何域(例如)。eu.gcr.io

选项 (1) 只提供一个临时令牌,因此您可能需要选项 (2)。得到那个$JSON_KEY

  1. 转到API 管理器 > 凭据
  2. 单击“创建凭据”>服务帐户密钥
    • 服务帐号:新服务帐号
      • 名称:任何你想要的,比如Docker Registry (read-only)
      • 作用:存储(向下滚动)>存储对象查看器
    • 密钥类型:JSON
  3. 下载为keyfile.json
  4. JSON_KEY=$(cat keyfile.json | tr '\n' ' ')
  5. 现在你可以使用它了。

登录后,您只需运行docker pull. 您还可以复制更新的内容~/.dockercfg以保留设置。

于 2017-03-31T14:27:14.800 回答
1

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

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

如果您这样做了,则不需要进一步的身份验证。

于 2015-03-29T15:44:37.933 回答
0

发布了一个官方的Google Container Registry Auth Plugin。欢迎您尝试并留下反馈/报告问题。

于 2015-06-27T17:28:04.583 回答
-1

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

它可以在https://github.com/Byclosure/gcr.io-login-plugin获得。

于 2015-05-12T15:44:08.930 回答