我已经使用 vmware-harbor v1.5.0 部署了一个私有 docker 注册表。虽然它可以与大多数功能一起使用,例如登录和拉/推图像,但是当我尝试使用 [管理] -> [复制] 时,总是会出现“需要身份验证”的错误。
以下是港口复制错误详细信息:
2018-08-06T06:57:41Z [INFO] 初始化完成:存储库:ops/test,标签:[3.4.11],源注册表:URL - http ://registry.xx.com insecure-true,目标注册表: URL - https://registry-slave.xx.com insecure-false
2018-08-06T06:57:41Z [警告] 在目标注册表上创建项目操作时状态码为 409,尝试执行下一步
2018-08-06T06:57:41Z [错误] [job_logger.go:81]:从源注册表中提取 ops/zookeeper:3.4.11 的清单时发生错误:401 {"errors":[{"code": "UNAUTHORIZED","message":"authentication required","detail":[{"Type":"repository","Class":"","Name":"ops/test","Action":"pull "}]}]
如上所述,UNAUTHORIZED 错误似乎是由于从本地提取图像而不是由于远程引起的。事实上,远程注册中心已经通过了【管理】->【注册中心】创建页面中的“测试连接”。
我想知道,是否有一些指定的配置应该设置为使用复制功能?从本地提取图像时使用了哪个角色?
所以我尝试阅读harbor源代码并在第230行的jobservice/job/impl/replication/transfer.go中找到错误消息引发点:
acceptMediaTypes := []string{schema1.MediaTypeManifest, schema2.MediaTypeManifest}
digest, mediaType, payload, err := t.srcRegistry.PullManifest(tag, acceptMediaTypes)
if err != nil {
t.logger.Errorf("an error occurred while pulling manifest of %s:%s from source registry: %v",
t.repository.name, tag, err)
return "", nil, err
如上代码,似乎从来没有考虑过 401 http 代码,acceptMediaTypes 是一些处理媒体类型的 http 标头,而不是身份验证。那么harbor如何从本地提取图像?
环境:
linux:Red Hat Enterprise Linux Server 7.5 版(迈坡)
港口:v1.5.0
码头工人(客户端和服务器):17.12.1-ce
网络拓扑:
nginx (https:443) -> 港口 (http:8082)
nginx和harbor都部署在同一个KVM上
“registry-test.xx.com”在 DNS 中解析
我更想知道有人成功使用harbor的复制功能...
所以任何人都可以帮我或只是一些提示?非常感谢~
更多细节:08-07
尝试从本地 KVM 获取一些 wireshark 信息
tcpdump -i any port 8082
如图所示,“/service/token”请求已经发送,并且得到了正确的token,但是后面的manifest请求没有携带anthenticate token,所以失败了。所以我不知道令牌缓存发生了什么。