栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Docker镜像名称如何解析?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Docker镜像名称如何解析?

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之前分离出来
/
,而没有它,整个名字将被传递给默认的注册表主机名。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/409293.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号