diff --git a/docs/reference/buildx_create.md b/docs/reference/buildx_create.md index 743d95de64ea..b4d60eb1912d 100644 --- a/docs/reference/buildx_create.md +++ b/docs/reference/buildx_create.md @@ -123,6 +123,8 @@ Passes additional driver-specific options. Details for each driver: ``` - `kubernetes` - `image=IMAGE` - Sets the container image to be used for running buildkit. + - `withqemu=(true|false)` - Install QEMU emulation for multi platforms support. + - `qemuimage=IMAGE` - Sets the QEMU emulation image. Defaults to `tonistiigi/binfmt:latest` - `namespace=NS` - Sets the Kubernetes namespace. Defaults to the current namespace. - `replicas=N` - Sets the number of `Pod` replicas. Defaults to 1. - `requests.cpu` - Sets the request CPU value specified in units of Kubernetes CPU. Example `requests.cpu=100m`, `requests.cpu=2` diff --git a/driver/bkimage/bkimage.go b/driver/bkimage/bkimage.go index fa6388c62ed1..f2443e7c1f0a 100644 --- a/driver/bkimage/bkimage.go +++ b/driver/bkimage/bkimage.go @@ -2,5 +2,6 @@ package bkimage const ( DefaultImage = "moby/buildkit:buildx-stable-1" // TODO: make this verified + QemuImage = "tonistiigi/binfmt:latest" // TODO: make this verified DefaultRootlessImage = DefaultImage + "-rootless" ) diff --git a/driver/kubernetes/driver.go b/driver/kubernetes/driver.go index b80069fe1c46..99313db91b0b 100644 --- a/driver/kubernetes/driver.go +++ b/driver/kubernetes/driver.go @@ -18,6 +18,8 @@ import ( "github.com/moby/buildkit/util/tracing/detect" "github.com/pkg/errors" appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" clientappsv1 "k8s.io/client-go/kubernetes/typed/apps/v1" @@ -39,15 +41,18 @@ type Driver struct { factory driver.Factory minReplicas int deployment *appsv1.Deployment + configMap *corev1.ConfigMap clientset *kubernetes.Clientset deploymentClient clientappsv1.DeploymentInterface podClient clientcorev1.PodInterface + configMapClient clientcorev1.ConfigMapInterface podChooser podchooser.PodChooser } func (d *Driver) IsMobyDriver() bool { return false } + func (d *Driver) Config() driver.InitConfig { return d.InitConfig } @@ -56,10 +61,20 @@ func (d *Driver) Bootstrap(ctx context.Context, l progress.Logger) error { return progress.Wrap("[internal] booting buildkit", l, func(sub progress.SubLogger) error { _, err := d.deploymentClient.Get(ctx, d.deployment.Name, metav1.GetOptions{}) if err != nil { - // TODO: return err if err != ErrNotFound - _, err = d.deploymentClient.Create(ctx, d.deployment, metav1.CreateOptions{}) - if err != nil { - return errors.Wrapf(err, "error while calling deploymentClient.Create for %q", d.deployment.Name) + if apierrors.IsNotFound(err) { + if d.configMap != nil { + // create ConfigMap first if exists + _, err = d.configMapClient.Create(ctx, d.configMap, metav1.CreateOptions{}) + if err != nil { + return errors.Wrapf(err, "error while calling configMapClient.Create for %q", d.configMap.Name) + } + } + _, err = d.deploymentClient.Create(ctx, d.deployment, metav1.CreateOptions{}) + if err != nil { + return errors.Wrapf(err, "error while calling deploymentClient.Create for %q", d.deployment.Name) + } + } else { + return errors.Wrapf(err, "error for bootstrap %q", d.deployment.Name) } } return sub.Wrap( diff --git a/driver/kubernetes/factory.go b/driver/kubernetes/factory.go index bff4212ca03b..6e3597cb020d 100644 --- a/driver/kubernetes/factory.go +++ b/driver/kubernetes/factory.go @@ -2,6 +2,7 @@ package kubernetes import ( "context" + "os" "strconv" "strings" @@ -59,11 +60,13 @@ func (f *factory) New(ctx context.Context, cfg driver.InitConfig) (driver.Driver if err != nil { return nil, err } + d := &Driver{ factory: f, InitConfig: cfg, clientset: clientset, } + deploymentOpt := &manifest.DeploymentOpt{ Name: deploymentName, Image: bkimage.DefaultImage, @@ -71,13 +74,26 @@ func (f *factory) New(ctx context.Context, cfg driver.InitConfig) (driver.Driver BuildkitFlags: cfg.BuildkitFlags, Rootless: false, Platforms: cfg.Platforms, + WithQemu: false, + QemuImage: bkimage.QemuImage, + } + + if cfg.ConfigFile != "" { + buildkitConfig, err := os.ReadFile(cfg.ConfigFile) + if err != nil { + return nil, err + } + deploymentOpt.BuildkitConfig = buildkitConfig } + loadbalance := LoadbalanceSticky - imageOverride := "" + for k, v := range cfg.DriverOpts { switch k { case "image": - imageOverride = v + if v != "" { + deploymentOpt.Image = v + } case "namespace": namespace = v case "replicas": @@ -117,20 +133,31 @@ func (f *factory) New(ctx context.Context, cfg driver.InitConfig) (driver.Driver return nil, errors.Errorf("invalid loadbalance %q", v) } loadbalance = v + case "withqemu": + deploymentOpt.WithQemu, err = strconv.ParseBool(v) + if err != nil { + return nil, err + } + case "qemuimage": + if v != "" { + deploymentOpt.QemuImage = v + } default: return nil, errors.Errorf("invalid driver option %s for driver %s", k, DriverName) } } - if imageOverride != "" { - deploymentOpt.Image = imageOverride - } - d.deployment, err = manifest.NewDeployment(deploymentOpt) + + d.deployment, d.configMap, err = manifest.NewDeployment(deploymentOpt) if err != nil { return nil, err } + d.minReplicas = deploymentOpt.Replicas + d.deploymentClient = clientset.AppsV1().Deployments(namespace) d.podClient = clientset.CoreV1().Pods(namespace) + d.configMapClient = clientset.CoreV1().ConfigMaps(namespace) + switch loadbalance { case LoadbalanceSticky: d.podChooser = &podchooser.StickyPodChooser{ diff --git a/driver/kubernetes/manifest/manifest.go b/driver/kubernetes/manifest/manifest.go index eb44a7731152..f22c07197e6a 100644 --- a/driver/kubernetes/manifest/manifest.go +++ b/driver/kubernetes/manifest/manifest.go @@ -12,11 +12,21 @@ import ( ) type DeploymentOpt struct { - Namespace string - Name string - Image string - Replicas int - BuildkitFlags []string + Namespace string + Name string + Image string + Replicas int + + // WithQemu + // when true, will install binfmt + WithQemu bool + QemuImage string + + BuildkitFlags []string + // BuildkitConfig + // when not empty, will create configmap with buildkit.toml and mounted + BuildkitConfig []byte + Rootless bool NodeSelector map[string]string RequestsCPU string @@ -31,7 +41,7 @@ const ( AnnotationPlatform = "buildx.docker.com/platform" ) -func NewDeployment(opt *DeploymentOpt) (*appsv1.Deployment, error) { +func NewDeployment(opt *DeploymentOpt) (d *appsv1.Deployment, c *corev1.ConfigMap, err error) { labels := map[string]string{ "app": opt.Name, } @@ -44,7 +54,7 @@ func NewDeployment(opt *DeploymentOpt) (*appsv1.Deployment, error) { annotations[AnnotationPlatform] = strings.Join(platformutil.Format(opt.Platforms), ",") } - d := &appsv1.Deployment{ + d = &appsv1.Deployment{ TypeMeta: metav1.TypeMeta{ APIVersion: appsv1.SchemeGroupVersion.String(), Kind: "Deployment", @@ -91,9 +101,56 @@ func NewDeployment(opt *DeploymentOpt) (*appsv1.Deployment, error) { }, }, } + + if len(opt.BuildkitConfig) > 0 { + c = &corev1.ConfigMap{ + TypeMeta: metav1.TypeMeta{ + APIVersion: corev1.SchemeGroupVersion.String(), + Kind: "ConfigMap", + }, + ObjectMeta: metav1.ObjectMeta{ + Namespace: opt.Namespace, + Name: opt.Name + "-config", + Annotations: annotations, + }, + Data: map[string]string{ + "buildkitd.toml": string(opt.BuildkitConfig), + }, + } + + d.Spec.Template.Spec.Containers[0].VolumeMounts = []corev1.VolumeMount{{ + Name: "config", + MountPath: "/etc/buildkit", + }} + + d.Spec.Template.Spec.Volumes = []corev1.Volume{{ + Name: "config", + VolumeSource: corev1.VolumeSource{ + ConfigMap: &corev1.ConfigMapVolumeSource{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: c.Name, + }, + }, + }, + }} + } + + if opt.WithQemu { + d.Spec.Template.Spec.InitContainers = []corev1.Container{ + { + Name: "qemu", + Image: opt.QemuImage, + Args: []string{"--install"}, + SecurityContext: &corev1.SecurityContext{ + Privileged: &privileged, + }, + }, + } + } + if opt.Rootless { if err := toRootless(d); err != nil { - return nil, err + return nil, nil, err } } @@ -104,7 +161,7 @@ func NewDeployment(opt *DeploymentOpt) (*appsv1.Deployment, error) { if opt.RequestsCPU != "" { reqCPU, err := resource.ParseQuantity(opt.RequestsCPU) if err != nil { - return nil, err + return nil, nil, err } d.Spec.Template.Spec.Containers[0].Resources.Requests[corev1.ResourceCPU] = reqCPU } @@ -112,7 +169,7 @@ func NewDeployment(opt *DeploymentOpt) (*appsv1.Deployment, error) { if opt.RequestsMemory != "" { reqMemory, err := resource.ParseQuantity(opt.RequestsMemory) if err != nil { - return nil, err + return nil, nil, err } d.Spec.Template.Spec.Containers[0].Resources.Requests[corev1.ResourceMemory] = reqMemory } @@ -120,7 +177,7 @@ func NewDeployment(opt *DeploymentOpt) (*appsv1.Deployment, error) { if opt.LimitsCPU != "" { limCPU, err := resource.ParseQuantity(opt.LimitsCPU) if err != nil { - return nil, err + return nil, nil, err } d.Spec.Template.Spec.Containers[0].Resources.Limits[corev1.ResourceCPU] = limCPU } @@ -128,12 +185,12 @@ func NewDeployment(opt *DeploymentOpt) (*appsv1.Deployment, error) { if opt.LimitsMemory != "" { limMemory, err := resource.ParseQuantity(opt.LimitsMemory) if err != nil { - return nil, err + return nil, nil, err } d.Spec.Template.Spec.Containers[0].Resources.Limits[corev1.ResourceMemory] = limMemory } - return d, nil + return } func toRootless(d *appsv1.Deployment) error { diff --git a/go.mod b/go.mod index 5ee9648cc1b9..54eb5861f616 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/docker/buildx -go 1.13 +go 1.16 require ( github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 // indirect diff --git a/vendor/modules.txt b/vendor/modules.txt index b74eecc5ddf6..774e933129c0 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -32,6 +32,7 @@ github.com/Microsoft/hcsshim/osversion # github.com/agext/levenshtein v1.2.1 github.com/agext/levenshtein # github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 +## explicit github.com/agl/ed25519 github.com/agl/ed25519/edwards25519 # github.com/apparentlymart/go-cidr v1.0.1 @@ -40,11 +41,22 @@ github.com/apparentlymart/go-cidr/cidr github.com/apparentlymart/go-textseg/v12/textseg # github.com/beorn7/perks v1.0.1 github.com/beorn7/perks/quantile +# github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 +## explicit +# github.com/bugsnag/bugsnag-go v1.4.1 +## explicit +# github.com/bugsnag/panicwrap v1.2.0 +## explicit +# github.com/cenkalti/backoff v2.1.1+incompatible +## explicit # github.com/cenkalti/backoff/v4 v4.1.1 github.com/cenkalti/backoff/v4 # github.com/cespare/xxhash/v2 v2.1.1 github.com/cespare/xxhash/v2 +# github.com/cloudflare/cfssl v0.0.0-20181213083726-b94e044bb51e +## explicit # github.com/compose-spec/compose-go v0.0.0-20210706130854-69459d4976b5 +## explicit github.com/compose-spec/compose-go/errdefs github.com/compose-spec/compose-go/interpolation github.com/compose-spec/compose-go/loader @@ -54,8 +66,10 @@ github.com/compose-spec/compose-go/types # github.com/containerd/cgroups v1.0.1 github.com/containerd/cgroups/stats/v1 # github.com/containerd/console v1.0.2 +## explicit github.com/containerd/console # github.com/containerd/containerd v1.5.2 +## explicit github.com/containerd/containerd/api/services/content/v1 github.com/containerd/containerd/archive/compression github.com/containerd/containerd/content @@ -85,10 +99,13 @@ github.com/containerd/continuity/sysx github.com/containerd/typeurl # github.com/davecgh/go-spew v1.1.1 github.com/davecgh/go-spew/spew +# github.com/denisenkom/go-mssqldb v0.0.0-20190315220205-a8ed825ac853 +## explicit # github.com/distribution/distribution/v3 v3.0.0-20210316161203-a01c71e2477e github.com/distribution/distribution/v3/digestset github.com/distribution/distribution/v3/reference # github.com/docker/cli v20.10.7+incompatible => github.com/docker/cli v20.10.3-0.20210702143511-f782d1355eff+incompatible +## explicit github.com/docker/cli/cli github.com/docker/cli/cli-plugins/manager github.com/docker/cli/cli-plugins/plugin @@ -114,8 +131,10 @@ github.com/docker/cli/cli/trust github.com/docker/cli/cli/version github.com/docker/cli/opts # github.com/docker/compose-on-kubernetes v0.4.19-0.20190128150448-356b2919c496 +## explicit github.com/docker/compose-on-kubernetes/api # github.com/docker/distribution v2.7.1+incompatible +## explicit github.com/docker/distribution github.com/docker/distribution/digestset github.com/docker/distribution/manifest @@ -133,6 +152,7 @@ github.com/docker/distribution/registry/storage/cache github.com/docker/distribution/registry/storage/cache/memory github.com/docker/distribution/uuid # github.com/docker/docker v20.10.7+incompatible => github.com/docker/docker v20.10.3-0.20210609100121-ef4d47340142+incompatible +## explicit github.com/docker/docker/api github.com/docker/docker/api/types github.com/docker/docker/api/types/blkiodev @@ -164,9 +184,11 @@ github.com/docker/docker/pkg/urlutil github.com/docker/docker/registry github.com/docker/docker/rootless # github.com/docker/docker-credential-helpers v0.6.4-0.20210125172408-38bea2ce277a +## explicit github.com/docker/docker-credential-helpers/client github.com/docker/docker-credential-helpers/credentials # github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c +## explicit github.com/docker/go/canonical/json # github.com/docker/go-connections v0.4.0 github.com/docker/go-connections/nat @@ -176,15 +198,26 @@ github.com/docker/go-connections/tlsconfig github.com/docker/go-metrics # github.com/docker/go-units v0.4.0 github.com/docker/go-units +# github.com/docker/libtrust v0.0.0-20150526203908-9cbd2a1374f4 +## explicit # github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c +## explicit github.com/docker/spdystream github.com/docker/spdystream/spdy +# github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484 +## explicit +# github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 +## explicit # github.com/fvbommel/sortorder v1.0.1 +## explicit github.com/fvbommel/sortorder # github.com/go-logr/logr v0.2.0 github.com/go-logr/logr # github.com/gofrs/flock v0.7.3 +## explicit github.com/gofrs/flock +# github.com/gofrs/uuid v3.3.0+incompatible +## explicit # github.com/gogo/googleapis v1.4.0 github.com/gogo/googleapis/google/rpc # github.com/gogo/protobuf v1.3.2 @@ -207,6 +240,8 @@ github.com/golang/protobuf/ptypes/timestamp github.com/golang/protobuf/ptypes/wrappers # github.com/golang/snappy v0.0.4-0.20210608040537-544b4180ac70 github.com/golang/snappy +# github.com/google/certificate-transparency-go v1.0.21 +## explicit # github.com/google/go-cmp v0.5.6 github.com/google/go-cmp/cmp github.com/google/go-cmp/cmp/internal/diff @@ -216,6 +251,7 @@ github.com/google/go-cmp/cmp/internal/value # github.com/google/gofuzz v1.1.0 github.com/google/gofuzz # github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 +## explicit github.com/google/shlex # github.com/google/uuid v1.2.0 github.com/google/uuid @@ -231,12 +267,16 @@ github.com/grpc-ecosystem/go-grpc-middleware github.com/grpc-ecosystem/grpc-gateway/internal github.com/grpc-ecosystem/grpc-gateway/runtime github.com/grpc-ecosystem/grpc-gateway/utilities +# github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed +## explicit # github.com/hashicorp/go-cty-funcs v0.0.0-20200930094925-2721b1e36840 +## explicit github.com/hashicorp/go-cty-funcs/cidr github.com/hashicorp/go-cty-funcs/crypto github.com/hashicorp/go-cty-funcs/encoding github.com/hashicorp/go-cty-funcs/uuid # github.com/hashicorp/hcl/v2 v2.8.2 +## explicit github.com/hashicorp/hcl/v2 github.com/hashicorp/hcl/v2/ext/customdecode github.com/hashicorp/hcl/v2/ext/tryfunc @@ -250,17 +290,29 @@ github.com/hashicorp/hcl/v2/json github.com/imdario/mergo # github.com/inconshreveable/mousetrap v1.0.0 github.com/inconshreveable/mousetrap +# github.com/jinzhu/gorm v1.9.2 +## explicit +# github.com/jinzhu/inflection v0.0.0-20180308033659-04140366298a +## explicit +# github.com/jinzhu/now v1.0.0 +## explicit # github.com/joho/godotenv v1.3.0 github.com/joho/godotenv # github.com/json-iterator/go v1.1.10 github.com/json-iterator/go +# github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 +## explicit # github.com/klauspost/compress v1.12.3 github.com/klauspost/compress/fse github.com/klauspost/compress/huff0 github.com/klauspost/compress/zstd github.com/klauspost/compress/zstd/internal/xxhash +# github.com/lib/pq v1.10.0 +## explicit # github.com/mattn/go-shellwords v1.0.12 github.com/mattn/go-shellwords +# github.com/mattn/go-sqlite3 v1.10.0 +## explicit # github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 github.com/matttproud/golang_protobuf_extensions/pbutil # github.com/miekg/pkcs11 v1.0.3 @@ -270,6 +322,7 @@ github.com/mitchellh/go-wordwrap # github.com/mitchellh/mapstructure v1.4.1 github.com/mitchellh/mapstructure # github.com/moby/buildkit v0.8.2-0.20210702160134-1a7543a10527 +## explicit github.com/moby/buildkit/api/services/control github.com/moby/buildkit/api/types github.com/moby/buildkit/client @@ -331,11 +384,14 @@ github.com/modern-go/reflect2 # github.com/morikuni/aec v1.0.0 github.com/morikuni/aec # github.com/opencontainers/go-digest v1.0.0 +## explicit github.com/opencontainers/go-digest # github.com/opencontainers/image-spec v1.0.1 +## explicit github.com/opencontainers/image-spec/specs-go github.com/opencontainers/image-spec/specs-go/v1 # github.com/pkg/errors v0.9.1 +## explicit github.com/pkg/errors # github.com/pmezard/go-difflib v1.0.0 github.com/pmezard/go-difflib/difflib @@ -354,17 +410,23 @@ github.com/prometheus/procfs github.com/prometheus/procfs/internal/fs github.com/prometheus/procfs/internal/util # github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002 +## explicit github.com/serialx/hashring # github.com/sirupsen/logrus v1.8.1 +## explicit github.com/sirupsen/logrus # github.com/spf13/cobra v1.1.1 +## explicit github.com/spf13/cobra # github.com/spf13/pflag v1.0.5 +## explicit github.com/spf13/pflag # github.com/stretchr/testify v1.7.0 +## explicit github.com/stretchr/testify/assert github.com/stretchr/testify/require # github.com/theupdateframework/notary v0.6.1 +## explicit github.com/theupdateframework/notary github.com/theupdateframework/notary/client github.com/theupdateframework/notary/client/changelist @@ -384,6 +446,7 @@ github.com/tonistiigi/fsutil github.com/tonistiigi/fsutil/prefix github.com/tonistiigi/fsutil/types # github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea +## explicit github.com/tonistiigi/units # github.com/tonistiigi/vt100 v0.0.0-20210615222946-8066bb97264f github.com/tonistiigi/vt100 @@ -394,6 +457,7 @@ github.com/xeipuuv/gojsonreference # github.com/xeipuuv/gojsonschema v1.2.0 github.com/xeipuuv/gojsonschema # github.com/zclconf/go-cty v1.7.1 +## explicit github.com/zclconf/go-cty/cty github.com/zclconf/go-cty/cty/convert github.com/zclconf/go-cty/cty/function @@ -412,6 +476,7 @@ go.opentelemetry.io/contrib # go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.21.0 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc # go.opentelemetry.io/otel v1.0.0-RC1 +## explicit go.opentelemetry.io/otel go.opentelemetry.io/otel/attribute go.opentelemetry.io/otel/baggage @@ -436,6 +501,7 @@ go.opentelemetry.io/otel/sdk/internal go.opentelemetry.io/otel/sdk/resource go.opentelemetry.io/otel/sdk/trace # go.opentelemetry.io/otel/trace v1.0.0-RC1 +## explicit go.opentelemetry.io/otel/trace # go.opentelemetry.io/proto/otlp v0.9.0 go.opentelemetry.io/proto/otlp/collector/trace/v1 @@ -475,6 +541,7 @@ golang.org/x/oauth2/internal golang.org/x/oauth2/jws golang.org/x/oauth2/jwt # golang.org/x/sync v0.0.0-20210220032951-036812b2e83c +## explicit golang.org/x/sync/errgroup golang.org/x/sync/semaphore # golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57 @@ -592,6 +659,12 @@ google.golang.org/protobuf/types/known/durationpb google.golang.org/protobuf/types/known/fieldmaskpb google.golang.org/protobuf/types/known/timestamppb google.golang.org/protobuf/types/known/wrapperspb +# gopkg.in/dancannon/gorethink.v3 v3.0.5 +## explicit +# gopkg.in/fatih/pool.v2 v2.0.0 +## explicit +# gopkg.in/gorethink/gorethink.v3 v3.0.5 +## explicit # gopkg.in/inf.v0 v0.9.1 gopkg.in/inf.v0 # gopkg.in/yaml.v2 v2.4.0 @@ -599,6 +672,7 @@ gopkg.in/yaml.v2 # gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c gopkg.in/yaml.v3 # k8s.io/api v0.20.6 +## explicit k8s.io/api/admissionregistration/v1 k8s.io/api/admissionregistration/v1beta1 k8s.io/api/apiserverinternal/v1alpha1 @@ -643,6 +717,7 @@ k8s.io/api/storage/v1 k8s.io/api/storage/v1alpha1 k8s.io/api/storage/v1beta1 # k8s.io/apimachinery v0.20.6 +## explicit k8s.io/apimachinery/pkg/api/errors k8s.io/apimachinery/pkg/api/meta k8s.io/apimachinery/pkg/api/resource @@ -683,6 +758,7 @@ k8s.io/apimachinery/pkg/watch k8s.io/apimachinery/third_party/forked/golang/netutil k8s.io/apimachinery/third_party/forked/golang/reflect # k8s.io/client-go v0.20.6 +## explicit k8s.io/client-go/discovery k8s.io/client-go/kubernetes k8s.io/client-go/kubernetes/scheme @@ -766,3 +842,5 @@ k8s.io/utils/integer sigs.k8s.io/structured-merge-diff/v4/value # sigs.k8s.io/yaml v1.2.0 sigs.k8s.io/yaml +# github.com/docker/cli => github.com/docker/cli v20.10.3-0.20210702143511-f782d1355eff+incompatible +# github.com/docker/docker => github.com/docker/docker v20.10.3-0.20210609100121-ef4d47340142+incompatible