Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解析Docker图像名称?_Docker_Docker Registry - Fatal编程技术网

如何解析Docker图像名称?

如何解析Docker图像名称?,docker,docker-registry,Docker,Docker Registry,在执行docker push或拉取图像时,docker如何确定图像名称中是否有注册表服务器,或者默认注册表(例如docker Hub)上是否有路径/用户名 我从网站上看到了以下内容: 标记 标记用于将用户给定的描述性名称映射到任何单个图像 ID.标记值仅限于字符集[a-zA-Z_0-9] 存储库 按公共前缀(组件名称)分组的标记集合 之前:)。例如,在名为my app:3.1.4的标记图像中, 我的应用程序是名称的存储库组件。存储库名称为 由斜杠分隔的名称组件组成,可选前缀为 DNS主机名。主机

在执行
docker push
或拉取图像时,docker如何确定图像名称中是否有注册表服务器,或者默认注册表(例如docker Hub)上是否有路径/用户名

我从网站上看到了以下内容:

标记

标记用于将用户给定的描述性名称映射到任何单个图像 ID.标记值仅限于字符集[a-zA-Z_0-9]

存储库

按公共前缀(组件名称)分组的标记集合 之前:)。例如,在名为my app:3.1.4的标记图像中, 我的应用程序是名称的存储库组件。存储库名称为 由斜杠分隔的名称组件组成,可选前缀为 DNS主机名。主机名必须符合标准DNS规则, 但不能包含u字符。如果存在主机名,则可能 可选地,后跟格式为8080的端口号。名称 组件可以包含小写字符、数字和分隔符。A. 分隔符定义为句点、一个或两个下划线或一个或多个 更多破折号。名称组件不能以分隔符开头或结尾


对于DNS主机名,是否需要使用dots完全限定,或者“我的本地服务器”是有效的注册表主机名?对于名称组件,我认为句点是有效的,这意味着“team.user/appserver”是一个有效的图像名称。如果注册表服务器在端口80上运行,因此映像名称中的主机名不需要端口号,则主机名和注册表服务器上的路径之间似乎存在歧义。我很好奇Docker是如何解决这种歧义的;DR:主机名必须在第一个
/
之前包含
dns分隔符、
端口分隔符或值“localhost”。否则,代码假定您需要默认注册表Docker Hub


在对代码进行了一些挖掘之后,我发现了以下内容:

// 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
它的实际实现是通过中的正则表达式实现的

但经过深入研究,我发现除了正则表达式之外还有另一个检查(例如,如果不包含
,则会出现大写主机名错误)。我在中找到了名称的实际分割,如下所示:

对我来说,最重要的部分是在第一个if语句中的第一个
/
之前检查
或主机名
localhost
。有了它,主机名将从第一个
/
之前分离出来,如果没有它,整个名称将传递给默认注册表主机名。

的映像规范现在已更新,表示标记限制为128个字符

公关线索在这里

这里有一些Ruby代码


一些Ruby测试是

根据图像规范,标记限制为127个字符。所以我认为标记regex应该是/[\w][\w.-]{0126}/regex的长度是0到127个字符,所以我认为这是正确的。如果不是,那么这将是一个公共关系来改变这一点:我是这样想的。。。。正则表达式启动[/w][\w.-]{0127},并且[]之间没有|。所以它意味着匹配a/w,然后匹配127\w或点或连字符。在Ruby的irb中尝试/^([\w][\w.-]{0,4})$/.match('ssss-')可以确认消耗了5个字符……我的眼睛在第一个
[\w]
上呆呆地看着,所以你是对的,正则表达式比规范长。如果你在PR上听到让这两个字符同步的消息,请告诉我,我很高兴更新这个答案。这很好。简言之,我将尝试这样记住它:
[[host:port/]registry/]component[:tag][@digest]
// 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
}