diff --git a/cmd/minikube/cmd/start_flags.go b/cmd/minikube/cmd/start_flags.go index 61d738269ebe2072dfef312fd0ca317d31518c42..a17e6084bca10672c153c4063de6242395793140 100644 --- a/cmd/minikube/cmd/start_flags.go +++ b/cmd/minikube/cmd/start_flags.go @@ -331,7 +331,9 @@ func generateClusterConfig(cmd *cobra.Command, existing *config.ClusterConfig, k }, } cc.VerifyComponents = interpretWaitFlag(*cmd) - + if viper.GetBool(createMount) && driver.IsKIC(drvName) { + cc.ContainerVolumeMounts = []string{viper.GetString(mountString)} + } cnm, err := cni.New(cc) if err != nil { return cc, config.Node{}, errors.Wrap(err, "cni") diff --git a/pkg/drivers/kic/kic.go b/pkg/drivers/kic/kic.go index 3adcd5b51fd9f0f328c633048f814b55fd6c9e6a..9f66c9ac2f2295ea5ad175e08ca6b7f1c674ffd1 100644 --- a/pkg/drivers/kic/kic.go +++ b/pkg/drivers/kic/kic.go @@ -68,6 +68,7 @@ func NewDriver(c Config) *Driver { // Create a host using the driver's config func (d *Driver) Create() error { params := oci.CreateParams{ + Mounts: d.NodeConfig.Mounts, Name: d.NodeConfig.MachineName, Image: d.NodeConfig.ImageDigest, ClusterLabel: oci.ProfileLabelKey + "=" + d.MachineName, diff --git a/pkg/drivers/kic/oci/types.go b/pkg/drivers/kic/oci/types.go index 9ede5b703278802180df79f1549421a5455b24a5..8a740eae2c77960719f469e6179b469d57eeee93 100644 --- a/pkg/drivers/kic/oci/types.go +++ b/pkg/drivers/kic/oci/types.go @@ -16,6 +16,13 @@ limitations under the License. package oci +import ( + "errors" + "fmt" + "path/filepath" + "strings" +) + const ( // DefaultBindIPV4 is The default IP the container will listen on. DefaultBindIPV4 = "127.0.0.1" @@ -102,6 +109,46 @@ type Mount struct { Propagation MountPropagation `protobuf:"varint,5,opt,name=propagation,proto3,enum=runtime.v1alpha2.MountPropagation" json:"propagation,omitempty"` } +// ParseMountString parses a mount string of format: +// '[host-path:]container-path[:]' The comma-delimited 'options' are +// [rw|ro], [Z], [srhared|rslave|rprivate]. +func ParseMountString(spec string) (m Mount, err error) { + switch fields := strings.Split(spec, ":"); len(fields) { + case 0: + err = errors.New("invalid empty spec") + case 1: + m.ContainerPath = fields[0] + case 3: + for _, opt := range strings.Split(fields[2], ",") { + switch opt { + case "Z": + m.SelinuxRelabel = true + case "ro": + m.Readonly = true + case "rw": + m.Readonly = false + case "rslave": + m.Propagation = MountPropagationHostToContainer + case "rshared": + m.Propagation = MountPropagationBidirectional + case "private": + m.Propagation = MountPropagationNone + default: + err = fmt.Errorf("unknown mount option: '%s'", opt) + } + } + fallthrough + case 2: + m.HostPath, m.ContainerPath = fields[0], fields[1] + if !filepath.IsAbs(m.ContainerPath) { + err = fmt.Errorf("'%s' container path must be absolute", m.ContainerPath) + } + default: + err = errors.New("spec must be in form: :[:]") + } + return m, err +} + // PortMapping specifies a host port mapped into a container port. // In yaml this looks like: // containerPort: 80 diff --git a/pkg/minikube/config/types.go b/pkg/minikube/config/types.go index 42a3e5c26bd62f295b52302c70c2e3322c04044d..e2f5a66438f496b153afd1da9d8803e3b14c4ceb 100644 --- a/pkg/minikube/config/types.go +++ b/pkg/minikube/config/types.go @@ -45,6 +45,7 @@ type ClusterConfig struct { HyperkitVpnKitSock string // Only used by the Hyperkit driver HyperkitVSockPorts []string // Only used by the Hyperkit driver DockerEnv []string // Each entry is formatted as KEY=VALUE. + ContainerVolumeMounts []string // Only used by container drivers: Docker, Podman InsecureRegistry []string RegistryMirror []string HostOnlyCIDR string // Only used by the virtualbox driver diff --git a/pkg/minikube/node/start.go b/pkg/minikube/node/start.go index b821d18f3a1997dd7ba19154cfd10c3515fb677a..6f9d24871c0993ef8bc4daaee9fa1da6cfc984e3 100644 --- a/pkg/minikube/node/start.go +++ b/pkg/minikube/node/start.go @@ -136,7 +136,9 @@ func Start(starter Starter, apiServer bool) (*kubeconfig.Settings, error) { } var wg sync.WaitGroup - go configureMounts(&wg) + if !driver.IsKIC(starter.Cfg.Driver) { + go configureMounts(&wg) + } wg.Add(1) go func() { diff --git a/pkg/minikube/registry/drvs/docker/docker.go b/pkg/minikube/registry/drvs/docker/docker.go index 8594017d182438a5116d386f0176ffdf1575215a..d2cfa572e254904f40e4e263d61f410a80b16b7f 100644 --- a/pkg/minikube/registry/drvs/docker/docker.go +++ b/pkg/minikube/registry/drvs/docker/docker.go @@ -49,10 +49,20 @@ func init() { } func configure(cc config.ClusterConfig, n config.Node) (interface{}, error) { + mounts := make([]oci.Mount, len(cc.ContainerVolumeMounts)) + for i, spec := range cc.ContainerVolumeMounts { + var err error + mounts[i], err = oci.ParseMountString(spec) + if err != nil { + return nil, err + } + } + return kic.NewDriver(kic.Config{ MachineName: driver.MachineName(cc, n), StorePath: localpath.MiniPath(), ImageDigest: cc.KicBaseImage, + Mounts: mounts, CPU: cc.CPUs, Memory: cc.Memory, OCIBinary: oci.Docker, diff --git a/pkg/minikube/registry/drvs/podman/podman.go b/pkg/minikube/registry/drvs/podman/podman.go index 0a67f42adae918b57f698dbf5e63048dcb4ef7ad..166fd9e6d5a336f48ef1bffefd33ada37cc7d284 100644 --- a/pkg/minikube/registry/drvs/podman/podman.go +++ b/pkg/minikube/registry/drvs/podman/podman.go @@ -63,10 +63,20 @@ func init() { } func configure(cc config.ClusterConfig, n config.Node) (interface{}, error) { + mounts := make([]oci.Mount, len(cc.ContainerVolumeMounts)) + for i, spec := range cc.ContainerVolumeMounts { + var err error + mounts[i], err = oci.ParseMountString(spec) + if err != nil { + return nil, err + } + } + return kic.NewDriver(kic.Config{ MachineName: driver.MachineName(cc, n), StorePath: localpath.MiniPath(), ImageDigest: strings.Split(cc.KicBaseImage, "@")[0], // for podman does not support docker images references with both a tag and digest. + Mounts: mounts, CPU: cc.CPUs, Memory: cc.Memory, OCIBinary: oci.Podman,