daemon: use the registry service config for getting registry hosts

The RegistryHosts lookup function is used by both BuildKit and by the
containerd snapshotter. However, this function differs in behaviour from
the config parser for the RegistryConfig:

- The protocol for insecure registries is treated as significant by
  RegistryHosts, while the RegistryConfig strips this information.
- RegistryConfig validates and deduplicates mirrors.
- RegistryConfig does not parse the insecure-registries as URLs, which
  can lead to parsing opaque URLs as was possible by the RegistryHosts
  function.

This patch updates the lookup function to ensure consistency.

Signed-off-by: Justin Chadwell <me@jedevc.com>
This commit is contained in:
Justin Chadwell 2023-07-17 12:13:17 +01:00
parent ee79423124
commit e0b065cc33

View file

@ -9,12 +9,10 @@ import (
"context"
"fmt"
"net"
"net/url"
"os"
"path"
"path/filepath"
"runtime"
"strings"
"sync"
"sync/atomic"
"time"
@ -194,42 +192,20 @@ func (daemon *Daemon) UsesSnapshotter() bool {
// RegistryHosts returns the registry hosts configuration for the host component
// of a distribution image reference.
func (daemon *Daemon) RegistryHosts(host string) ([]docker.RegistryHost, error) {
var (
conf = daemon.config()
registryKey = "docker.io"
mirrors = make([]string, len(conf.Mirrors))
m = map[string]resolverconfig.RegistryConfig{}
)
// must trim "https://" or "http://" prefix
for i, v := range conf.Mirrors {
if uri, err := url.Parse(v); err == nil {
v = uri.Host
}
mirrors[i] = v
}
// set mirrors for default registry
m[registryKey] = resolverconfig.RegistryConfig{Mirrors: mirrors}
var m = map[string]resolverconfig.RegistryConfig{}
for _, v := range conf.InsecureRegistries {
u, err := url.Parse(v)
if err != nil && !strings.HasPrefix(v, "http://") && !strings.HasPrefix(v, "https://") {
originalErr := err
u, err = url.Parse("http://" + v)
if err != nil {
err = originalErr
}
}
mirrors := daemon.registryService.ServiceConfig().Mirrors
m["docker.io"] = resolverconfig.RegistryConfig{Mirrors: mirrors}
conf := daemon.registryService.ServiceConfig().IndexConfigs
for k, v := range conf {
c := resolverconfig.RegistryConfig{}
if err == nil {
v = u.Host
if !v.Secure {
t := true
if u.Scheme == "http" {
c.PlainHTTP = &t
} else {
c.Insecure = &t
}
c.PlainHTTP = &t
c.Insecure = &t
}
m[v] = c
m[k] = c
}
for k, v := range m {