diff --git a/builder/builder.go b/builder/builder.go index 5a877ae8..0ff7d93b 100644 --- a/builder/builder.go +++ b/builder/builder.go @@ -208,7 +208,7 @@ type driverFactory struct { } // Factory returns the driver factory. -func (b *Builder) Factory(ctx context.Context) (_ driver.Factory, err error) { +func (b *Builder) Factory(ctx context.Context, dialMeta map[string][]string) (_ driver.Factory, err error) { b.driverFactory.once.Do(func() { if b.Driver != "" { b.driverFactory.Factory, err = driver.GetFactory(b.Driver, true) @@ -231,7 +231,7 @@ func (b *Builder) Factory(ctx context.Context) (_ driver.Factory, err error) { if _, err = dockerapi.Ping(ctx); err != nil { return } - b.driverFactory.Factory, err = driver.GetDefaultFactory(ctx, ep, dockerapi, false) + b.driverFactory.Factory, err = driver.GetDefaultFactory(ctx, ep, dockerapi, false, dialMeta) if err != nil { return } diff --git a/builder/node.go b/builder/node.go index e4e22a91..fc21f587 100644 --- a/builder/node.go +++ b/builder/node.go @@ -45,7 +45,8 @@ func (b *Builder) Nodes() []Node { type LoadNodesOption func(*loadNodesOptions) type loadNodesOptions struct { - data bool + data bool + dialMeta map[string][]string } func WithData() LoadNodesOption { @@ -54,6 +55,12 @@ func WithData() LoadNodesOption { } } +func WithDialMeta(dialMeta map[string][]string) LoadNodesOption { + return func(o *loadNodesOptions) { + o.dialMeta = dialMeta + } +} + // LoadNodes loads and returns nodes for this builder. // TODO: this should be a method on a Node object and lazy load data for each driver. func (b *Builder) LoadNodes(ctx context.Context, opts ...LoadNodesOption) (_ []Node, err error) { @@ -73,7 +80,7 @@ func (b *Builder) LoadNodes(ctx context.Context, opts ...LoadNodesOption) (_ []N } }() - factory, err := b.Factory(ctx) + factory, err := b.Factory(ctx, lno.dialMeta) if err != nil { return nil, err } @@ -132,7 +139,7 @@ func (b *Builder) LoadNodes(ctx context.Context, opts ...LoadNodesOption) (_ []N } } - d, err := driver.GetDriver(ctx, "buildx_buildkit_"+n.Name, factory, n.Endpoint, dockerapi, imageopt.Auth, kcc, n.Flags, n.Files, n.DriverOpts, n.Platforms, b.opts.contextPathHash) + d, err := driver.GetDriver(ctx, "buildx_buildkit_"+n.Name, factory, n.Endpoint, dockerapi, imageopt.Auth, kcc, n.Flags, n.Files, n.DriverOpts, n.Platforms, b.opts.contextPathHash, lno.dialMeta) if err != nil { node.Err = err return nil diff --git a/commands/create.go b/commands/create.go index 874dccd5..94c122ef 100644 --- a/commands/create.go +++ b/commands/create.go @@ -123,7 +123,7 @@ func runCreate(dockerCli command.Cli, in createOptions, args []string) error { if len(args) > 0 { arg = args[0] } - f, err := driver.GetDefaultFactory(ctx, arg, dockerCli.Client(), true) + f, err := driver.GetDefaultFactory(ctx, arg, dockerCli.Client(), true, nil) if err != nil { return err } diff --git a/driver/docker-container/factory.go b/driver/docker-container/factory.go index 118d9c5a..4f5b75d9 100644 --- a/driver/docker-container/factory.go +++ b/driver/docker-container/factory.go @@ -28,7 +28,7 @@ func (*factory) Usage() string { return "docker-container" } -func (*factory) Priority(ctx context.Context, endpoint string, api dockerclient.APIClient) int { +func (*factory) Priority(ctx context.Context, endpoint string, api dockerclient.APIClient, dialMeta map[string][]string) int { if api == nil { return priorityUnsupported } diff --git a/driver/docker/driver.go b/driver/docker/driver.go index 8f33e473..0bed4187 100644 --- a/driver/docker/driver.go +++ b/driver/docker/driver.go @@ -58,7 +58,7 @@ func (d *Driver) Rm(ctx context.Context, force, rmVolume, rmDaemon bool) error { func (d *Driver) Client(ctx context.Context) (*client.Client, error) { opts := []client.ClientOpt{ client.WithContextDialer(func(context.Context, string) (net.Conn, error) { - return d.DockerAPI.DialHijack(ctx, "/grpc", "h2c", nil) + return d.DockerAPI.DialHijack(ctx, "/grpc", "h2c", d.DialMeta) }), client.WithSessionDialer(func(ctx context.Context, proto string, meta map[string][]string) (net.Conn, error) { return d.DockerAPI.DialHijack(ctx, "/session", proto, meta) }), diff --git a/driver/docker/factory.go b/driver/docker/factory.go index 8f2e37bc..9e9cab27 100644 --- a/driver/docker/factory.go +++ b/driver/docker/factory.go @@ -26,12 +26,12 @@ func (*factory) Usage() string { return "docker" } -func (*factory) Priority(ctx context.Context, endpoint string, api dockerclient.APIClient) int { +func (*factory) Priority(ctx context.Context, endpoint string, api dockerclient.APIClient, dialMeta map[string][]string) int { if api == nil { return priorityUnsupported } - c, err := api.DialHijack(ctx, "/grpc", "h2c", nil) + c, err := api.DialHijack(ctx, "/grpc", "h2c", dialMeta) if err != nil { return priorityUnsupported } diff --git a/driver/kubernetes/factory.go b/driver/kubernetes/factory.go index 044e192d..8f353484 100644 --- a/driver/kubernetes/factory.go +++ b/driver/kubernetes/factory.go @@ -34,7 +34,7 @@ func (*factory) Usage() string { return DriverName } -func (*factory) Priority(ctx context.Context, endpoint string, api dockerclient.APIClient) int { +func (*factory) Priority(ctx context.Context, endpoint string, api dockerclient.APIClient, dialMeta map[string][]string) int { if api == nil { return priorityUnsupported } diff --git a/driver/manager.go b/driver/manager.go index de71746e..012aa17a 100644 --- a/driver/manager.go +++ b/driver/manager.go @@ -17,7 +17,7 @@ import ( type Factory interface { Name() string Usage() string - Priority(ctx context.Context, endpoint string, api dockerclient.APIClient) int + Priority(ctx context.Context, endpoint string, api dockerclient.APIClient, dialMeta map[string][]string) int New(ctx context.Context, cfg InitConfig) (Driver, error) AllowsInstances() bool } @@ -57,8 +57,8 @@ type InitConfig struct { DriverOpts map[string]string Auth Auth Platforms []specs.Platform - // ContextPathHash can be used for determining pods in the driver instance - ContextPathHash string + ContextPathHash string // can be used for determining pods in the driver instance + DialMeta map[string][]string } var drivers map[string]Factory @@ -70,7 +70,7 @@ func Register(f Factory) { drivers[f.Name()] = f } -func GetDefaultFactory(ctx context.Context, ep string, c dockerclient.APIClient, instanceRequired bool) (Factory, error) { +func GetDefaultFactory(ctx context.Context, ep string, c dockerclient.APIClient, instanceRequired bool, dialMeta map[string][]string) (Factory, error) { if len(drivers) == 0 { return nil, errors.Errorf("no drivers available") } @@ -83,7 +83,7 @@ func GetDefaultFactory(ctx context.Context, ep string, c dockerclient.APIClient, if instanceRequired && !f.AllowsInstances() { continue } - dd = append(dd, p{f: f, priority: f.Priority(ctx, ep, c)}) + dd = append(dd, p{f: f, priority: f.Priority(ctx, ep, c, dialMeta)}) } sort.Slice(dd, func(i, j int) bool { return dd[i].priority < dd[j].priority @@ -103,7 +103,7 @@ func GetFactory(name string, instanceRequired bool) (Factory, error) { return nil, errors.Errorf("failed to find driver %q", name) } -func GetDriver(ctx context.Context, name string, f Factory, endpointAddr string, api dockerclient.APIClient, auth Auth, kcc KubeClientConfig, flags []string, files map[string][]byte, do map[string]string, platforms []specs.Platform, contextPathHash string) (*DriverHandle, error) { +func GetDriver(ctx context.Context, name string, f Factory, endpointAddr string, api dockerclient.APIClient, auth Auth, kcc KubeClientConfig, flags []string, files map[string][]byte, do map[string]string, platforms []specs.Platform, contextPathHash string, dialMeta map[string][]string) (*DriverHandle, error) { ic := InitConfig{ EndpointAddr: endpointAddr, DockerAPI: api, @@ -114,11 +114,12 @@ func GetDriver(ctx context.Context, name string, f Factory, endpointAddr string, Auth: auth, Platforms: platforms, ContextPathHash: contextPathHash, + DialMeta: dialMeta, Files: files, } if f == nil { var err error - f, err = GetDefaultFactory(ctx, endpointAddr, api, false) + f, err = GetDefaultFactory(ctx, endpointAddr, api, false, dialMeta) if err != nil { return nil, err } diff --git a/driver/remote/factory.go b/driver/remote/factory.go index 374d97d5..e3287fb4 100644 --- a/driver/remote/factory.go +++ b/driver/remote/factory.go @@ -35,7 +35,7 @@ func (*factory) Usage() string { return "remote" } -func (*factory) Priority(ctx context.Context, endpoint string, api dockerclient.APIClient) int { +func (*factory) Priority(ctx context.Context, endpoint string, api dockerclient.APIClient, dialMeta map[string][]string) int { if util.IsValidEndpoint(endpoint) != nil { return priorityUnsupported }