Skip to content

Commit a72752b

Browse files
committed
add support of registry-mirrors and insecure-registries to buildkit
Signed-off-by: Anda Xu <anda.xu@docker.com> (cherry picked from commit 171d51c)
1 parent ff9340c commit a72752b

5 files changed

Lines changed: 73 additions & 6 deletions

File tree

builder/builder-next/adapters/containerimage/pull.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
"github.com/moby/buildkit/util/flightcontrol"
3535
"github.com/moby/buildkit/util/imageutil"
3636
"github.com/moby/buildkit/util/progress"
37+
"github.com/moby/buildkit/util/resolver"
3738
"github.com/moby/buildkit/util/tracing"
3839
digest "github.com/opencontainers/go-digest"
3940
"github.com/opencontainers/image-spec/identity"
@@ -51,6 +52,7 @@ type SourceOpt struct {
5152
DownloadManager distribution.RootFSDownloadManager
5253
MetadataStore metadata.V2MetadataService
5354
ImageStore image.Store
55+
ResolverOpt resolver.ResolveOptionsFunc
5456
}
5557

5658
type imageSource struct {
@@ -71,11 +73,16 @@ func (is *imageSource) ID() string {
7173
return source.DockerImageScheme
7274
}
7375

74-
func (is *imageSource) getResolver(ctx context.Context) remotes.Resolver {
75-
return docker.NewResolver(docker.ResolverOptions{
76+
func (is *imageSource) getResolver(ctx context.Context, rfn resolver.ResolveOptionsFunc, ref string) remotes.Resolver {
77+
opt := docker.ResolverOptions{
7678
Client: tracing.DefaultClient,
7779
Credentials: is.getCredentialsFromSession(ctx),
78-
})
80+
}
81+
if rfn != nil {
82+
opt = rfn(ref)
83+
}
84+
r := docker.NewResolver(opt)
85+
return r
7986
}
8087

8188
func (is *imageSource) getCredentialsFromSession(ctx context.Context) func(string) (string, string, error) {
@@ -118,7 +125,7 @@ func (is *imageSource) resolveRemote(ctx context.Context, ref string, platform *
118125
dt []byte
119126
}
120127
res, err := is.g.Do(ctx, ref, func(ctx context.Context) (interface{}, error) {
121-
dgst, dt, err := imageutil.Config(ctx, ref, is.getResolver(ctx), is.ContentStore, platform)
128+
dgst, dt, err := imageutil.Config(ctx, ref, is.getResolver(ctx, is.ResolverOpt, ref), is.ContentStore, platform)
122129
if err != nil {
123130
return nil, err
124131
}
@@ -181,7 +188,7 @@ func (is *imageSource) Resolve(ctx context.Context, id source.Identifier) (sourc
181188
p := &puller{
182189
src: imageIdentifier,
183190
is: is,
184-
resolver: is.getResolver(ctx),
191+
resolver: is.getResolver(ctx, is.ResolverOpt, imageIdentifier.Reference.String()),
185192
platform: platform,
186193
}
187194
return p, nil

builder/builder-next/builder.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/moby/buildkit/session"
2424
"github.com/moby/buildkit/solver/llbsolver"
2525
"github.com/moby/buildkit/util/entitlements"
26+
"github.com/moby/buildkit/util/resolver"
2627
"github.com/moby/buildkit/util/tracing"
2728
"github.com/pkg/errors"
2829
"golang.org/x/sync/errgroup"
@@ -55,6 +56,7 @@ type Opt struct {
5556
Dist images.DistributionServices
5657
NetworkController libnetwork.NetworkController
5758
DefaultCgroupParent string
59+
ResolverOpt resolver.ResolveOptionsFunc
5860
}
5961

6062
// Builder can build using BuildKit backend

builder/builder-next/controller.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ func newController(rt http.RoundTripper, opt Opt) (*control.Controller, error) {
9797
MetadataStore: dist.V2MetadataService,
9898
ImageStore: dist.ImageStore,
9999
ReferenceStore: dist.ReferenceStore,
100+
ResolverOpt: opt.ResolverOpt,
100101
})
101102
if err != nil {
102103
return nil, err
@@ -160,7 +161,7 @@ func newController(rt http.RoundTripper, opt Opt) (*control.Controller, error) {
160161
WorkerController: wc,
161162
Frontends: frontends,
162163
CacheKeyStorage: cacheStorage,
163-
ResolveCacheImporterFunc: registryremotecache.ResolveCacheImporterFunc(opt.SessionManager),
164+
ResolveCacheImporterFunc: registryremotecache.ResolveCacheImporterFunc(opt.SessionManager, opt.ResolverOpt),
164165
// TODO: set ResolveCacheExporterFunc for exporting cache
165166
})
166167
}

cmd/dockerd/daemon.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ func newRouterOptions(config *config.Config, d *daemon.Daemon) (routerOptions, e
291291
Dist: d.DistributionServices(),
292292
NetworkController: d.NetworkController(),
293293
DefaultCgroupParent: cgroupParent,
294+
ResolverOpt: d.NewResolveOptionsFunc(),
294295
})
295296
if err != nil {
296297
return opts, err

daemon/daemon.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"context"
1010
"fmt"
1111
"io/ioutil"
12+
"math/rand"
1213
"net"
1314
"os"
1415
"path"
@@ -23,6 +24,8 @@ import (
2324
"github.com/containerd/containerd"
2425
"github.com/containerd/containerd/defaults"
2526
"github.com/containerd/containerd/pkg/dialer"
27+
"github.com/containerd/containerd/remotes/docker"
28+
"github.com/docker/distribution/reference"
2629
"github.com/docker/docker/api/types"
2730
containertypes "github.com/docker/docker/api/types/container"
2831
"github.com/docker/docker/api/types/swarm"
@@ -36,6 +39,8 @@ import (
3639
"github.com/docker/docker/daemon/logger"
3740
"github.com/docker/docker/daemon/network"
3841
"github.com/docker/docker/errdefs"
42+
"github.com/moby/buildkit/util/resolver"
43+
"github.com/moby/buildkit/util/tracing"
3944
"github.com/sirupsen/logrus"
4045
// register graph drivers
4146
_ "github.com/docker/docker/daemon/graphdriver/register"
@@ -141,6 +146,57 @@ func (daemon *Daemon) Features() *map[string]bool {
141146
return &daemon.configStore.Features
142147
}
143148

149+
// NewResolveOptionsFunc returns a call back function to resolve "registry-mirrors" and
150+
// "insecure-registries" for buildkit
151+
func (daemon *Daemon) NewResolveOptionsFunc() resolver.ResolveOptionsFunc {
152+
return func(ref string) docker.ResolverOptions {
153+
var (
154+
registryKey = "docker.io"
155+
mirrors = make([]string, len(daemon.configStore.Mirrors))
156+
m = map[string]resolver.RegistryConf{}
157+
)
158+
// must trim "https://" or "http://" prefix
159+
for i, v := range daemon.configStore.Mirrors {
160+
v = strings.TrimPrefix(v, "https://")
161+
v = strings.TrimPrefix(v, "http://")
162+
mirrors[i] = v
163+
}
164+
// set "registry-mirrors"
165+
m[registryKey] = resolver.RegistryConf{Mirrors: mirrors}
166+
// set "insecure-registries"
167+
for _, v := range daemon.configStore.InsecureRegistries {
168+
v = strings.TrimPrefix(v, "http://")
169+
m[v] = resolver.RegistryConf{
170+
PlainHTTP: true,
171+
}
172+
}
173+
def := docker.ResolverOptions{
174+
Client: tracing.DefaultClient,
175+
}
176+
177+
parsed, err := reference.ParseNormalizedNamed(ref)
178+
if err != nil {
179+
return def
180+
}
181+
host := reference.Domain(parsed)
182+
183+
c, ok := m[host]
184+
if !ok {
185+
return def
186+
}
187+
188+
if len(c.Mirrors) > 0 {
189+
def.Host = func(string) (string, error) {
190+
return c.Mirrors[rand.Intn(len(c.Mirrors))], nil
191+
}
192+
}
193+
194+
def.PlainHTTP = c.PlainHTTP
195+
196+
return def
197+
}
198+
}
199+
144200
func (daemon *Daemon) restore() error {
145201
containers := make(map[string]*container.Container)
146202

0 commit comments

Comments
 (0)