无法从容器优化的计算引擎从私有GCR提取图像

时间:2018-07-08 22:27:24

标签: docker google-compute-engine google-container-registry

无法理解我在做什么...

在基于Container Optimized OS的全新计算引擎实例上执行下一步:

  • queryset = Company.objects.filter(point = None) # using None queryset = Company.objects.filter(point__isnull = True) # explicitly asking for Null
  • docker-credential-gcr configure-docker

并得到以下信息:

  

无法在本地找到映像'gcr.io/around-dev/firebase-service-image:latest'   拉存储库gcr.io/around-dev/firebase-service-image   码头工人:未经授权:需要身份验证。   请参阅“ docker run --help”。

然后实际上尝试使用sudo docker run --detach --name=echo --net=esp_net gcr.io/around-dev/firebase-service-image:latest登录并运行,但仍然遇到相同的错误。 毕竟我的.docker / .config.json看起来像:

docker-credential-gcr gcr-login

显然没有存储凭据。有人可以向我解释我在做什么错吗? 预先感谢。

5 个答案:

答案 0 :(得分:7)

为什么看到这个

您看到此错误的原因是,您先运行docker-credential-gcr configure-docker而不先运行sudo,然后再运行sudo docker run ...。运行sudo docker时,它将在/root/.docker/中查找配置文件,但找不到任何内容,从而引发authentication required错误。

为什么运行sudo docker-credential-gcr configure-docker无法解决

运行COS时,您没有对所有目录的写权限。只有几个目录是可写的,/root不是其中之一。因此,以root用户身份运行docker-credential-gcr失败,因为它无法在$HOME目录(恰好是/root)内写入docker配置文件。

有关可写目录的更多详细信息:https://cloud.google.com/container-optimized-os/docs/concepts/security#filesystem

修复

1-覆盖$HOME

sudo HOME=/home/root /usr/bin/docker-credential-gcr configure-docker

sudo HOME=/home/root docker run --detach --name=echo --net=esp_net gcr.io/around-dev/firebase-service-image:latest

2-手动指定配置文件位置

您还可以在每个命令中包含docker config目录的路径。例如,如果您知道docker在/home/root/.docker目录中配置了凭据,则可以运行以下命令:sudo docker --config /home/root/.docker pull gcr.io/my-project/alpine:3.2

答案 1 :(得分:0)

当我想将图像推送到GCR时遇到了相同的问题。我还使用sudo运行了docker。我通过将用户添加到docker用户组来解决问题,如docker postinstall guide所示:

sudo groupadd docker
sudo usermod -aG docker $USER

然后注销并再次登录

答案 2 :(得分:0)

如果您有私有VPC,并且实例没有外部IP,则会收到超时错误。解决此问题的一种方法是在子网级别启用private_ip_google_access。这样一来,您无需例外即可访问google资源,而无需在实例上使用外部IP地址。

答案 3 :(得分:0)

我在使用COS,也遇到类似的问题。 COS文档使它看起来应该像运行2条命令一样简单。

$ docker-credential-gcr configure-docker
$ docker run --rm gcr.io/<your-project>/<your-image>

该文件在~/.docker/config.json中创建。但是我无法拉出私有映像来运行它。我可以成功提取公共图像。

在一天中的大部分时间里,我都把头扑在墙上,然后尝试了登录命令docker-credential-gcr gcr-login。我的帐户上有2factor身份验证设置,当我运行该命令时,它给了我一个我必须访问才能输入身份验证令牌的URL。按照这些说明进行操作之后,我现在可以成功地从私有注册表中提取图像了。

我不确定这是否是正确的工作流程,因为文档中未对此进行介绍。

答案 4 :(得分:0)

另一种选择是在docker中使用gcloud-image,这本身就是docker基本映像

假设您在$ PWD / gcr-auth.json中有服务帐户密钥文件 只需将docker-socks和您的服务json密钥传递给卷

docker run -exec \
-v $PWD:$PWD \
-v /var/run/docker.sock:/var/run/docker.sock \
google/cloud-sdk \
sh -c
 'gcloud auth activate-service-account --key-file=/somepath/gcr-auth.json && gcloud docker -- pull gcr.io/some-project/myimage:latest'

提取完成后,图像又回到了主机上