【问题标题】:Unable to pull image from private GCR from Container Optimized Compute Engine无法从 Container Optimized Compute Engine 的私有 GCR 中提取映像
【发布时间】:2018-07-08 22:27:23
【问题描述】:

无法理解我做错了什么......

在基于容器优化操作系统的新计算引擎实例上执行后续步骤:

  • docker-credential-gcr configure-docker
  • sudo docker run --detach --name=echo --net=esp_net gcr.io/around-dev/firebase-service-image:latest

得到以下结果:

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

然后尝试实际使用docker-credential-gcr gcr-login 登录并运行,但仍然出现相同的错误。 毕竟我的 .docker/.config.json 看起来像:

 {
        "auths": {},
        "credHelpers": {
                "asia.gcr.io": "gcr",
                "eu.gcr.io": "gcr",
                "gcr.io": "gcr",
                "staging-k8s.gcr.io": "gcr",
                "us.gcr.io": "gcr"
        }

显然没有存储凭据。有人可以向我解释我做错了什么吗? 提前致谢。

【问题讨论】:

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


    【解决方案1】:

    为什么你会看到这个

    您看到此错误是因为您在没有sudo 的情况下运行了docker-credential-gcr configure-docker,然后是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

    【讨论】:

      【解决方案2】:

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

      sudo groupadd docker
      sudo usermod -aG docker $USER
      

      然后注销并重新登录

      【讨论】:

      • 确保您注销并重新登录,而不是重新启动实例。就我而言,这是重置 docker 组
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        另一种选择是在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'
        

        拉取完成后,图像回到主机上

        【讨论】:

          【解决方案5】:

          我在使用 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 auth 设置,当我运行该命令时,它给了我一个 URL,我必须访问该 URL 才能输入身份验证令牌。按照这些说明操作后,我现在可以成功地从私有注册表中提取图像。

          我不确定这是否是正确的工作流程,因为它没有包含在文档中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-08-23
            • 1970-01-01
            • 1970-01-01
            • 2017-06-03
            • 2021-09-19
            • 1970-01-01
            • 2020-08-16
            • 1970-01-01
            相关资源
            最近更新 更多