问题 从Google Container Registry w / o gcloud中提取私人码头图片


我正在使用可发送的方式将私有泊坞窗图像推送到Google容器注册表,然后我想从笔记本电脑本地或Google Compute Engine上的实例中取出。

我知道那个命令 gcloud preview docker pull gcr.io/projectID/image-name 但是我不能依赖gcloud安装在每个人可能需要从中提取图像的机器上。

如果我跑 docker-compose up -d 在我的机器上,然后我收到以下错误:

Pulling image gcr.io/projectID/image-name...
Pulling repository gcr.io/projectID/image-name
Traceback (most recent call last):
  File "<string>", line 3, in <module>
  File "/compose/build/docker-compose/out00-PYZ.pyz/compose.cli.main", line 31, in main
  File "/compose/build/docker-compose/out00-PYZ.pyz/compose.cli.docopt_command", line 21, in sys_dispatch
  File "/compose/build/docker-compose/out00-PYZ.pyz/compose.cli.command", line 27, in dispatch
  File "/compose/build/docker-compose/out00-PYZ.pyz/compose.cli.docopt_command", line 24, in dispatch
  File "/compose/build/docker-compose/out00-PYZ.pyz/compose.cli.command", line 59, in perform_command
  File "/compose/build/docker-compose/out00-PYZ.pyz/compose.cli.main", line 464, in up
  File "/compose/build/docker-compose/out00-PYZ.pyz/compose.project", line 208, in up
  File "/compose/build/docker-compose/out00-PYZ.pyz/compose.service", line 214, in recreate_containers
  File "/compose/build/docker-compose/out00-PYZ.pyz/compose.service", line 199, in create_container
  File "/compose/build/docker-compose/out00-PYZ.pyz/compose.progress_stream", line 37, in stream_output
  File "/compose/build/docker-compose/out00-PYZ.pyz/compose.progress_stream", line 50, in print_output_event
compose.progress_stream.StreamOutputError: Error: Status 403 trying to pull repository projectID/image-name: "Access denied."

有没有办法用某种形式的OAuth或密钥验证或访问图像?我想避免在每个需要拉动图像的机器上安装gcloud,并且图像必须保持私密。

我努力了 gcloud preview docker -a 但这不是我正在寻找的解决方案。

预先感谢您的任何帮助。


4543
2018-06-18 22:21


起源

你试过这个: stackoverflow.com/questions/29291576/... - mattmoor
是的,您的解决方案适用于GCE(谢谢!),但是在本地计算机上运行时无法应用它。还有一个问题是我必须在创建的每个GCE实例上手动进行身份验证,这不可扩展。 - Maverick
在本地,您仍然可以使用“docker login”,但将“gcloud auth print-access-token”替换为curl(或gcloud docker -a)。 - mattmoor
关于身份验证,是的。您可以考虑尝试将container-vm映像作为主机映像,它有一个crontab可以自动更新这些凭据(您不需要使用清单)。看到: cloud.google.com/compute/docs/containers/container_vms - mattmoor
你知道怎么做吗?在这里使用CoreOS而没有python,没有gcloud选项,因为我需要在主机上提取图像。 - MrE


答案:


如果您想使用香草码头工具在不在Google Compute Engine(即本地)的计算机上使用Google容器注册表,您可以 按照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有关生成密钥文件的文档


11
2017-11-18 04:22



是否 _json_key 来自json文件?知道它对应哪个领域? - Ivan Balashov
_json_key 是一个字面值。这是向GCR发出的信号 -p 旗。 - anthonator