diff --git a/util/push/push.go b/util/push/push.go index 6d78df13..10172a22 100644 --- a/util/push/push.go +++ b/util/push/push.go @@ -13,6 +13,7 @@ import ( "github.com/containerd/containerd/remotes" "github.com/containerd/containerd/remotes/docker" "github.com/docker/distribution/reference" + "github.com/moby/buildkit/cmd/buildkitd/config" "github.com/moby/buildkit/session" "github.com/moby/buildkit/util/flightcontrol" "github.com/moby/buildkit/util/imageutil" @@ -42,6 +43,17 @@ func Push(ctx context.Context, sm *session.Manager, sid string, cs content.Store ref = reference.TagNameOnly(parsed).String() } + if insecure { + insecureTrue := true + httpTrue := true + hosts = resolver.NewRegistryConfig(map[string]config.RegistryConfig{ + reference.Domain(parsed): { + Insecure: &insecureTrue, + PlainHTTP: &httpTrue, + }, + }) + } + resolver := resolver.New(hosts, resolver.NewSessionAuthenticator(sm, session.NewGroup(sid))) pusher, err := resolver.Pusher(ctx, ref) diff --git a/util/resolver/resolver.go b/util/resolver/resolver.go index e7b3c97e..677b30be 100644 --- a/util/resolver/resolver.go +++ b/util/resolver/resolver.go @@ -22,29 +22,51 @@ import ( "github.com/pkg/errors" ) -func fillInsecureOpts(host string, c config.RegistryConfig, h *docker.RegistryHost) error { +func fillInsecureOpts(host string, c config.RegistryConfig, h docker.RegistryHost) ([]docker.RegistryHost, error) { + var hosts []docker.RegistryHost + tc, err := loadTLSConfig(c) if err != nil { - return err + return nil, err } + var isHTTP bool if c.PlainHTTP != nil && *c.PlainHTTP { - h.Scheme = "http" - } else if c.Insecure != nil && *c.Insecure { - tc.InsecureSkipVerify = true - } else if c.PlainHTTP == nil { + isHTTP = true + } + if c.PlainHTTP == nil { if ok, _ := docker.MatchLocalhost(host); ok { - h.Scheme = "http" + isHTTP = true } } - transport := newDefaultTransport() - transport.TLSClientConfig = tc - - h.Client = &http.Client{ - Transport: tracing.NewTransport(transport), + if isHTTP { + h2 := h + h2.Scheme = "http" + hosts = append(hosts, h2) } - return nil + if c.Insecure != nil && *c.Insecure { + h2 := h + transport := newDefaultTransport() + transport.TLSClientConfig = tc + h2.Client = &http.Client{ + Transport: tracing.NewTransport(transport), + } + tc.InsecureSkipVerify = true + hosts = append(hosts, h2) + } + + if len(hosts) == 0 { + transport := newDefaultTransport() + transport.TLSClientConfig = tc + + h.Client = &http.Client{ + Transport: tracing.NewTransport(transport), + } + hosts = append(hosts, h) + } + + return hosts, nil } func loadTLSConfig(c config.RegistryConfig) (*tls.Config, error) { @@ -116,11 +138,12 @@ func NewRegistryConfig(m map[string]config.RegistryConfig) docker.RegistryHosts Capabilities: docker.HostCapabilityPull | docker.HostCapabilityResolve, } - if err := fillInsecureOpts(mirror, m[mirror], &h); err != nil { + hosts, err := fillInsecureOpts(mirror, m[mirror], h) + if err != nil { return nil, err } - out = append(out, h) + out = append(out, hosts...) } if host == "docker.io" { @@ -135,11 +158,12 @@ func NewRegistryConfig(m map[string]config.RegistryConfig) docker.RegistryHosts Capabilities: docker.HostCapabilityPush | docker.HostCapabilityPull | docker.HostCapabilityResolve, } - if err := fillInsecureOpts(host, c, &h); err != nil { + hosts, err := fillInsecureOpts(host, c, h) + if err != nil { return nil, err } - out = append(out, h) + out = append(out, hosts...) return out, nil }, docker.ConfigureDefaultRegistries(