diff --git a/pkg/drivers/kic/kic.go b/pkg/drivers/kic/kic.go index 153f43c8170213df15786430f7142d68dbe44cb5..aee0501166de022f07e5f37ad6cc7d17f8dd2800 100644 --- a/pkg/drivers/kic/kic.go +++ b/pkg/drivers/kic/kic.go @@ -122,27 +122,22 @@ func (d *Driver) Create() error { } var waitForPreload sync.WaitGroup - if d.NodeConfig.OCIBinary == oci.Docker { - waitForPreload.Add(1) - go func() { - defer waitForPreload.Done() - // If preload doesn't exist, don't bother extracting tarball to volume - if !download.PreloadExists(d.NodeConfig.KubernetesVersion, d.NodeConfig.ContainerRuntime) { - return - } - t := time.Now() - glog.Infof("Starting extracting preloaded images to volume ...") - // Extract preloaded images to container - if err := oci.ExtractTarballToVolume(d.NodeConfig.OCIBinary, download.TarballPath(d.NodeConfig.KubernetesVersion, d.NodeConfig.ContainerRuntime), params.Name, d.NodeConfig.ImageDigest); err != nil { - glog.Infof("Unable to extract preloaded tarball to volume: %v", err) - } else { - glog.Infof("duration metric: took %f seconds to extract preloaded images to volume", time.Since(t).Seconds()) - } - }() - } else { - // driver == "podman" - glog.Info("Driver isn't docker, skipping extracting preloaded images") - } + waitForPreload.Add(1) + go func() { + defer waitForPreload.Done() + // If preload doesn't exist, don't bother extracting tarball to volume + if !download.PreloadExists(d.NodeConfig.KubernetesVersion, d.NodeConfig.ContainerRuntime) { + return + } + t := time.Now() + glog.Infof("Starting extracting preloaded images to volume ...") + // Extract preloaded images to container + if err := oci.ExtractTarballToVolume(d.NodeConfig.OCIBinary, download.TarballPath(d.NodeConfig.KubernetesVersion, d.NodeConfig.ContainerRuntime), params.Name, d.NodeConfig.ImageDigest); err != nil { + glog.Infof("Unable to extract preloaded tarball to volume: %v", err) + } else { + glog.Infof("duration metric: took %f seconds to extract preloaded images to volume", time.Since(t).Seconds()) + } + }() if err := oci.CreateContainerNode(params); err != nil { return errors.Wrap(err, "create kic node") diff --git a/pkg/drivers/kic/oci/oci.go b/pkg/drivers/kic/oci/oci.go index 3ef6a94cfbc925668d9caf13846a70ab900f0888..e66b76597ced6bde9e1139422182f1b3d3f731bb 100644 --- a/pkg/drivers/kic/oci/oci.go +++ b/pkg/drivers/kic/oci/oci.go @@ -99,6 +99,10 @@ func PrepareContainerNode(p CreateParams) error { return errors.Wrapf(err, "creating volume for %s container", p.Name) } glog.Infof("Successfully created a %s volume %s", p.OCIBinary, p.Name) + if err := prepareVolume(p.OCIBinary, p.Image, p.Name); err != nil { + return errors.Wrapf(err, "preparing volume for %s container", p.Name) + } + glog.Infof("Successfully prepared a %s volume %s", p.OCIBinary, p.Name) return nil } diff --git a/pkg/drivers/kic/oci/volumes.go b/pkg/drivers/kic/oci/volumes.go index f3fb62d13a68bd9cba39dfa693e20e16e1f64243..ef1629df83fd753292a305093964ad0af42d1033 100644 --- a/pkg/drivers/kic/oci/volumes.go +++ b/pkg/drivers/kic/oci/volumes.go @@ -106,3 +106,14 @@ func createVolume(ociBin string, profile string, nodeName string) error { } return nil } + +// prepareVolume will copy the initial content of the mount point by starting a container to check the expected content +func prepareVolume(ociBin string, imageName string, nodeName string) error { + cmdArgs := []string{"run", "--rm", "--entrypoint", "/usr/bin/test"} + cmdArgs = append(cmdArgs, "-v", fmt.Sprintf("%s:/var", nodeName), imageName, "-d", "/var/lib") + cmd := exec.Command(ociBin, cmdArgs...) + if _, err := runCmd(cmd); err != nil { + return err + } + return nil +}