8000 add optional fields in daemon.json to enable buildkit · moby/moby@2be1766 · GitHub
[go: up one dir, main page]

Skip to content

Commit 2be1766

Browse files
committed
add optional fields in daemon.json to enable buildkit
Signed-off-by: Anda Xu <anda.xu@docker.com>
1 parent 14d5569 commit 2be1766

File tree

10 files changed

+71
-33
lines changed

10 files changed

+71
-33
lines changed

api/server/router/build/build.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
package build // import "github.com/docker/docker/api/server/router/build"
22

3-
import "github.com/docker/docker/api/server/router"
3+
import (
4+
"github.com/docker/docker/api/server/router"
5+
"github.com/docker/docker/api/types"
6+
)
47

58
// buildRouter is a router to talk with the build controller
69
type buildRouter struct {
7-
backend Backend
8-
daemon experimentalProvider
9-
routes []router.Route
10+
backend Backend
11+
daemon experimentalProvider
12+
routes []router.Route
13+
builderVersion types.BuilderVersion
1014
}
1115

1216
// NewRouter initializes a new build router
13-
func NewRouter(b Backend, d experimentalProvider) router.Router {
14-
r := &buildRouter{backend: b, daemon: d}
17+
func NewRouter(b Backend, d experimentalProvider, bv types.BuilderVersion) router.Router {
18+
r := &buildRouter{backend: b, daemon: d, builderVersion: bv}
1519
r.initRoutes()
1620
return r
1721
}

api/server/router/build/build_routes.go

Lines changed: 4 additions & 2 deletions
6187
Original file line numberDiff line numberDiff line change
@@ -230,8 +230,10 @@ func (br *buildRouter) postBuild(ctx context.Context, w http.ResponseWriter, r *
230230
return errdefs.InvalidParameter(errors.New("squash is only supported with experimental mode"))
231231
}
232232

233-
if buildOptions.Version == types.BuilderBuildKit && !br.daemon.HasExperimental() {
234-
return errdefs.InvalidParameter(errors.New("buildkit is only supported with experimental mode"))
233+
// check if the builder feature has been enabled from daemon as well.
234+
if buildOptions.Version == types.BuilderBuildKit &&
235+
(br.builderVersion != types.BuilderBuildKit || !br.daemon.HasExperimental()) {
236+
return errdefs.InvalidParameter(errors.New("buildkit is not enabled on daemon"))
235237
}
236238

237239
out := io.Writer(output)

api/server/router/system/system.go

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,35 @@ package system // import "github.com/docker/docker/api/server/router/system"
22

33
import (
44
"github.com/docker/docker/api/server/router"
5+
"github.com/docker/docker/api/types"
56
buildkit "github.com/docker/docker/builder/builder-next"
67
"github.com/docker/docker/builder/fscache"
78
)
89

910
// systemRouter provides information about the Docker system overall.
1011
// It gathers information about host, daemon and container events.
1112
type systemRouter struct {
12-
backend Backend
13-
cluster ClusterBackend
14-
routes []router.Route
15-
fscache *fscache.FSCache // legacy
16-
builder *buildkit.Builder
13+
backend Backend
14+
cluster ClusterBackend
15+
routes []router.Route
16+
fscache *fscache.FSCache // legacy
17+
builder *buildkit.Builder
18+
builderVersion types.BuilderVersion
1719
}
1820

1921
// NewRouter initializes a new system router
20-
func NewRouter(b Backend, c ClusterBackend, fscache *fscache.FSCache, builder *buildkit.Builder) router.Router {
22+
func NewRouter(b Backend, c ClusterBackend, fscache *fscache.FSCache, builder *buildkit.Builder, bv types.BuilderVersion) router.Router {
2123
r := &systemRouter{
22-
backend: b,
23-
cluster: c,
24-
fscache: fscache,
25-
builder: builder,
24+
backend: b,
25+
cluster: c,
26+
fscache: fscache,
27+
builder: builder,
28+
builderVersion: bv,
2629
}
2730

2831
r.routes = []router.Route{
2932
router.NewOptionsRoute("/{anyroute:.*}", optionsHandler),
30-
router.NewGetRoute("/_ping", pingHandler),
33+
router.NewGetRoute("/_ping", r.pingHandler),
3134
router.NewGetRoute("/events", r.getEvents, router.WithCancel),
3235
router.NewGetRoute("/info", r.getInfo),
3336
router.NewGetRoute("/version", r.getVersion),

api/server/router/system/system_routes.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ func optionsHandler(ctx context.Context, w http.ResponseWriter, r *http.Request,
2525
return nil
2626
}
2727

28-
func pingHandler(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
28+
func (s *systemRouter) pingHandler(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
29+
if bv := s.builderVersion; bv != "" {
30+
w.Header().Set("Builder-Version", string(bv))
31+
}
2932
_, err := w.Write([]byte{'O', 'K'})
3033
return err
3134
}

api/swagger.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6972,6 +6972,9 @@ paths:
69726972
API-Version:
69736973
type: "string"
69746974
description: "Max API Version the server supports"
6975+
BuildKit-Version:
6976+
type: "string"
6977+
description: "Default version of docker image builder"
69756978
Docker-Experimental:
69766979
type: "boolean"
69776980
description: "If the server is running with experimental mode enabled"

api/types/types.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,10 @@ type ContainerStats struct {
102102
// Ping contains response of Engine API:
103103
// GET "/_ping"
104104
type Ping struct {
105-
APIVersion string
106-
OSType string
107-
Experimental bool
105+
APIVersion string
106+
OSType string
107+
Experimental bool
108+
BuilderVersion BuilderVersion
108109
}
109110

110111
// ComponentVersion describes the version information for a specific component.

client/ping.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
"github.com/docker/docker/api/types"
88
)
99

10-
// Ping pings the server and returns the value of the "Docker-Experimental", "OS-Type" & "API-Version" headers
10+
// Ping pings the server and returns the value of the "Docker-Experimental", "Builder-Version", "OS-Type" & "API-Version" headers
1111
func (cli *Client) Ping(ctx context.Context) (types.Ping, error) {
1212
var ping types.Ping
1313
req, err := cli.buildRequest("GET", path.Join(cli.basePath, "/_ping"), nil, nil)
@@ -27,6 +27,9 @@ func (cli *Client) Ping(ctx context.Context) (types.Ping, error) {
2727
ping.Experimental = true
2828
}
2929
ping.OSType = serverResp.header.Get("OSType")
30+
if bv := serverResp.header.Get("Builder-Version"); bv != "" {
31+
ping.BuilderVersion = types.BuilderVersion(bv)
32+
}
3033
}
3134
return ping, cli.checkResponseErr(serverResp)
3235
}

cmd/dockerd/config.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ func installCommonConfigFlags(conf *config.Config, flags *pflag.FlagSet) {
6565

6666
flags.StringVar(&conf.SwarmDefaultAdvertiseAddr, "swarm-default-advertise-addr", "", "Set default address or interface for swarm advertised address")
6767
flags.BoolVar(&conf.Experimental, "experimental", false, "Enable experimental features")
68-
6968
flags.StringVar(&conf.MetricsAddress, "metrics-addr", "", "Set default address and port to serve the metrics api on")
7069

7170
flags.Var(opts.NewNamedListOptsRef("node-generic-resources", &conf.NodeGenericResources, opts.ValidateSingleGenericResource), "node-generic-resource", "Advertise user-defined resource")

cmd/dockerd/daemon.go

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
swarmrouter "github.com/docker/docker/api/server/router/swarm"
2828
systemrouter "github.com/docker/docker/api/server/router/system"
2929
"github.com/docker/docker/api/server/router/volume"
30+
"github.com/docker/docker/api/types"
3031
buildkit "github.com/docker/docker/builder/builder-next"
3132
"github.com/docker/docker/builder/dockerfile"
3233
"github.com/docker/docker/builder/fscache"
@@ -253,6 +254,7 @@ type routerOptions struct {
253254
buildBackend *buildbackend.Backend
254255
buildCache *fscache.FSCache // legacy
255256
buildkit *buildkit.Builder
257+
builderVersion types.BuilderVersion
256258
daemon *daemon.Daemon
257259
api *apiserver.Server
258260
cluster *cluster.Cluster
@@ -283,8 +285,7 @@ func newRouterOptions(config *config.Config, daemon *daemon.Daemon) (routerOptio
283285
if err != nil {
284286
return opts, err
285287
}
286-
287-
buildkit, err := buildkit.New(buildkit.Opt{
288+
bk, err := buildkit.New(buildkit.Opt{
288289
SessionManager: sm,
289290
Root: filepath.Join(config.Root, "buildkit"),
290291
Dist: daemon.DistributionServices(),
@@ -293,16 +294,24 @@ func newRouterOptions(config *config.Config, daemon *daemon.Daemon) (routerOptio
293294
return opts, err
294295
}
295296

296-
bb, err := buildbackend.NewBackend(daemon.ImageService(), manager, buildCache, buildkit)
297+
bb, err := buildbackend.NewBackend(daemon.ImageService(), manager, buildCache, bk)
297298
if err != nil {
298299
return opts, errors.Wrap(err, "failed to create buildmanager")
299300
}
300-
301+
var bv types.BuilderVersion
302+
if v, ok := config.Features["buildkit"]; ok {
303+
if v {
304+
bv = types.BuilderBuildKit
305+
} else {
306+
bv = types.BuilderV1
307+
}
308+
}
301309
return routerOptions{
302310
sessionManager: sm,
303311
buildBackend: bb,
304312
buildCache: buildCache,
305-
buildkit: buildkit,
313+
buildkit: bk,
314+
builderVersion: bv,
306315
daemon: daemon,
307316
}, nil
308317
}
@@ -476,9 +485,9 @@ func initRouter(opts routerOptions) {
476485
checkpointrouter.NewRouter(opts.daemon, decoder),
477486
container.NewRouter(opts.daemon, decoder),
478487
image.NewRouter(opts.daemon.ImageService()),
479-
systemrouter.NewRouter(opts.daemon, opts.cluster, opts.buildCache, opts.buildkit),
488+
systemrouter.NewRouter(opts.daemon, opts.cluster, opts.buildCache, opts.buildkit, opts.builderVersion),
480489
volume.NewRouter(opts.daemon.VolumesService()),
481-
build.NewRouter(opts.buildBackend, opts.daemon),
490+
build.NewRouter(opts.buildBackend, opts.daemon, opts.builderVersion),
482491
sessionrouter.NewRouter(opts.sessionManager),
483492
swarmrouter.NewRouter(opts.cluster),
484493
pluginrouter.NewRouter(opts.daemon.PluginManager()),

daemon/config/config.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,13 @@ var flatOptions = map[string]bool{
5656
"default-ulimits": true,
5757
}
5858

59+
// skipValidateOptions contains configuration keys
60+
// that will be skipped from findConfigurationConflicts
61+
// for unknown flag validation.
62+
var skipValidateOptions = map[string]bool{
63+
"features": true,
64+
}
65+
5966
// LogConfig represents the default log configuration.
6067
// It includes json tags to deserialize configuration from a file
6168
// using the same names that the flags in the command line use.
@@ -203,6 +210,10 @@ type CommonConfig struct {
203210
// should be configured with the CRI plugin enabled. This allows using
204211
// Docker's containerd instance directly with a Kubernetes kubelet.
205212
CriContainerd bool `json:"cri-containerd,omitempty"`
213+
214+
// Features contains a list of feature key value pairs indicating what features are enabled or disabled.
215+
// If a certain feature doesn't appear in this list then it's unset (i.e. neither true nor false).
216+
Features map[string]bool `json:"features,omitempty"`
206217
}
207218

208219
// IsValueSet returns true if a configuration value
@@ -444,7 +455,7 @@ func findConfigurationConflicts(config map[string]interface{}, flags *pflag.Flag
444455
// 1. Search keys from the file that we don't recognize as flags.
445456
unknownKeys := make(map[string]interface{})
446457
for key, value := range config {
447-
if flag := flags.Lookup(key); flag == nil {
458+
if flag := flags.Lookup(key); flag == nil && !skipValidateOptions[key] {
448459
unknownKeys[key] = value
449460
}
450461
}

0 commit comments

Comments
 (0)
0