从私有注册表中提取失败-不支持的Docker v1存储库请求

时间:2018-10-09 23:33:28

标签: docker kubernetes artifactory google-kubernetes-engine

我正在尝试使用私有注册表(Artifactory)在Kubernetes集群(1.9.7-gke.6)上运行容器。

Failed to pull image "myrepo.myartifactory.mycompany.com/org/image:latest": rpc error: code = Unknown desc = Error: Status 400 trying to pull repository org/image: "{
\"errors\" :[ {
    \"status\" : 400,
    \"message\" : \"Unsupported docker v1 repository request for 'myrepo'\"\n  } ]
}"

我认为这意味着docker客户端尝试执行v1注册表请求,我们的Artifactory安装似乎不支持该请求。

我检查了集群节点的docker版本:

$ kubectl describe nodes | grep docker
 Container Runtime Version:  docker://17.3.2
 Container Runtime Version:  docker://17.3.2
 Container Runtime Version:  docker://17.3.2

我找到了Docker标志--disable-legacy-registry=true,但是我不确定如何以这种方式最好地配置我的GKE集群。

2 个答案:

答案 0 :(得分:2)

幸运的是,您可以通过SSH进入GKE节点(不能与GKE主节点连接)。因此,您可以在所有节点的/etc/docker/daemon.json文件中添加此标志。像这样:

{
  ...
  "disable-legacy-registry": true,
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "1g",
    "max-file": "3"
  }
  ...
}

然后在所有节点上重新启动docker。在每个节点中:

sudo docker systemctl restart docker

请注意,此标志已完全removed,来自Docker 17.12及更高版本。

答案 1 :(得分:1)

实际的问题是我们的注册表凭据已更改。在我们的集群上更新拉取凭据解决了该问题。

我假设在某些情况下注册表API返回错误(例如,身份验证或授权错误)时可能会发生此问题。在这种情况下,泊坞窗客户端会尝试降级到较旧的API版本-Artifactory上不可用。

这将导致Artifactory返回所提到的Unsupported docker v1 repository request for 'myrepo'错误,但不幸的是掩盖了实际错误。