码头工人推时的权限问题

时间:2019-04-01 00:41:02

标签: docker docker-image

我正在尝试将我的docker映像推送到google容器映像注册表,但收到一条错误消息,提示我没有执行此操作所需的权限。

我已经尝试过gcloud auth configure-docker,但是它对我不起作用。

我首先使用以下命令构建图像: docker build -t gcr.io/trynew/hello-world-image:v1。

然后,我尝试附加标签并将其推送: docker push gcr.io/trynew/hello-world-image:v1

这是我的输出:

    The push refers to repository [gcr.io/trynew/hello-world-image]

    e62774cdb1c2: Preparing 
    0f6265b750f3: Preparing 
    f82351274ce3: Preparing 
    31a16430afc8: Preparing 
    67298499a3ed: Preparing 
    62d5f39c8fe4: Waiting 
    9f8566ee5135: Waiting 
    unauthorized: You don't have the needed permissions to perform this
    operation, and you may have invalid credentials. 
    To authenticate your request, follow the steps in: 
https://cloud.google.com/container-registry/docs/advanced-authentication

7 个答案:

答案 0 :(得分:3)

https://stackoverflow.com/a/59799035/2628337 1所述,在Linux版本的cloud sdk中似乎存在一个错误,该错误使用标准身份验证方法(gcloud auth configure-docker)进行身份验证失败。相反,请按this创建一个JSON密钥文件,这种文件很有效。

答案 1 :(得分:3)

以防万一其他人用头撞墙,我的 PIA VPN 导致了这种行为。

"unauthorized: You don't have the needed permissions to perform this operation, and you may have invalid credentials. To authenticate your request, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication"

关闭我的 VPN,它工作正常。重新打开它,它又坏了。

答案 2 :(得分:1)

为了能够将映像推送到私有注册表,您需要做两件事: API访问范围使用注册表对虚拟机进行身份验证

对于 API访问范围https://cloud.google.com/container-registry/docs/using-with-google-cloud-platform),我们可以阅读官方文档:

对于GKE:

  

默认情况下,新的Google Kubernetes Engine群集使用   存储分区的只读权限。设置读写   创建Google Kubernetes Engine群集时的存储范围,请使用   --scopes选项。

对于GCE:

  

默认情况下,Compute Engine VM具有只读访问范围   配置用于存储桶。要推送私有Docker映像,您的   实例必须具有配置为的读写存储访问范围   在访问范围中进行了说明。

因此,首先,请验证您的GKE集群或GCE实例是否实际设置了适当的范围。

下一步是对注册表进行身份验证:

a)如果您使用的是基于Linux的映像,则需要使用“ gcloud auth configure-docker ”(https://cloud.google.com/container-registry/docs/advanced-authentication)。

b)对于容器优化的操作系统(COS),命令为“ docker-credential-gcr configure-docker ”(https://cloud.google.com/container-optimized-os/docs/how-to/run-container-instance#accessing_private_google_container_registry

答案 3 :(得分:1)

Windows / Powershell

当我在安装 SDK 时打开的 google cloud shell 中进行身份验证后尝试从普通 powershell 窗口运行 docker push 时,在 Windows 上遇到此错误。

解决方案很简单:

在运行 gcloud auth configure-docker 命令后启动一个新的 powershell 窗口来运行 docker push

确保您也激活了注册表:

gcloud services enable containerregistry.googleapis.com

此外,Google 倾向于跳转到默认帐户,该帐户可能是您想要的,也可能不是。请确保您在浏览器中打开的任何链接是否都在正确的 Google 帐户中。

我还不太确定发生了什么,因为我是 Docker 的新手,但是在启动一个新的 Powershell 实例时有些东西刷新了。

答案 4 :(得分:0)

Google云服务包含有关如何授予docker push权限的特定信息,这是我认为应该首先了解的https://cloud.google.com/container-registry/docs/access-control

在检查您是否具有足够的权限之后,您应该使用以下方式进行身份验证:

gcloud auth configure-docker

在此处查看更多信息:https://cloud.google.com/container-registry/docs/pushing-and-pulling

答案 5 :(得分:0)

如果您以 root 身份运行 docker(即使用 sudo docker),请确保将身份验证配置为 root。例如,您可以运行:

sudo -s
gcloud auth login
gcloud auth configure-docker

...这将在 /root/.docker/config.json 下创建(或更新)一个文件。

gcloud auth login 作为 root 是否有任何安全隐患?请在评论中告诉我。)

答案 6 :(得分:0)

我仍然无法让 gcloud auth configure-docker 助手工作。所做的是使用 access token 进行身份验证,就像这样

gcloud auth print-access-token | docker login -u oauth2accesstoken --password-stdin https://HOSTNAME 

其中 HOSTNAME 是 gcr.ious.gcr.ioeu.gcr.ioasia.gcr.io。 (一定要包含https://,否则会失效)

您可以查看 print-access-token here 的选项。