
TL; DR:主机名必须在第
.一个主机名之前包含dns分隔符或
:端口分隔符
/,否则代码假定您要使用默认注册表。
在仔细研究了代码之后,我遇到了distribution / reference /
reference.go,内容如下:
// Grammar//// reference := name [ ":" tag ] [ "@" digest ]// name := [hostname '/'] component ['/' component]*// hostname := hostcomponent ['.' hostcomponent]* [':' port-number]// hostcomponent := /([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])/// port-number := /[0-9]+/// component := alpha-numeric [separator alpha-numeric]*// alpha-numeric := /[a-z0-9]+/// separator := /[_.]|__|[-]*///// tag := /[w][w.-]{0,127}///// digest := digest-algorithm ":" digest-hex// digest-algorithm := digest-algorithm-component [ digest-algorithm-separator digest-algorithm-component ]// digest-algorithm-separator := /[+.-_]/// digest-algorithm-component := /[A-Za-z][A-Za-z0-9]*/// digest-hex:= /[0-9a-fA-F]{32,}/ ; At least 128 bit digest value实际的实现是通过distribution / reference /
regexp.go中的regex实现的。
但是经过一番摸索之后,我发现除了该正则表达式外还有另一项检查(如果不包含a
.或,则会出现大写主机名错误
:)。我在docker /
distribution / reference /
normalize.go中将名称的实际拆分跟踪到以下内容:
// splitDockerDomain splits a repository name to domain and remotename string.// If no valid domain is found, the default domain is used. Repository name// needs to be already validated before.func splitDockerDomain(name string) (domain, remainder string) { i := strings.IndexRune(name, '/') if i == -1 || (!strings.ContainsAny(name[:i], ".:") && name[:i] != "localhost") { domain, remainder = defaultDomain, name } else { domain, remainder = name[:i], name[i+1:] } if domain == legacyDefaultDomain { domain = defaultDomain } if domain == defaultDomain && !strings.ContainsRune(remainder, '/') { remainder = officialReponame + "/" + remainder } return}对我而言,重要的部分是检查if语句中的第一个
.和
:第一个之前的and
/。有了它,主机名就会从first之前分离出来
/,而没有它,整个名字将被传递给默认的注册表主机名。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)