Ответ 1
TL; DR: имя хоста должно содержать .
разделитель dns или разделитель :
port перед первым /
, в противном случае код предполагает, что вам нужен реестр по умолчанию.
Немного покопавшись в коде, я наткнулся на дистрибутив /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
Реальная реализация этого осуществляется через регулярное выражение в дистрибутиве /reference/regexp.go.
Но, немного покопавшись, я обнаружил, что есть еще одна проверка помимо этого регулярного выражения (вы получите ошибки с именем хоста в верхнем регистре, если вы не включите .
Или :
. И я отследил фактическое разделение имени до следующего в 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. При этом имя хоста отделяется от первого /
, а без него все имя передается в имя хоста реестра по умолчанию.