Skip to content

Commit

Permalink
Merge pull request #11356 from kubernetes/revert-11063-daemon-podman
Browse files Browse the repository at this point in the history
Revert "base-image: Allow using podman as well as docker daemon"
  • Loading branch information
medyagh authored May 10, 2021
2 parents a1de285 + d9482f6 commit 329a1fb
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 191 deletions.
108 changes: 24 additions & 84 deletions pkg/minikube/image/image.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ const (
defaultDomain = "docker.io"
)

var daemonBinary string
var defaultPlatform = v1.Platform{
Architecture: runtime.GOARCH,
OS: "linux",
Expand Down Expand Up @@ -85,27 +84,15 @@ func DigestByDockerLib(imgClient *client.Client, imgName string) string {
return img.ID
}

// DigestByPodmanExec uses podman to return image digest
func DigestByPodmanExec(imgName string) string {
cmd := exec.Command("sudo", "-n", "podman", "image", "inspect", "--format", "{{.Id}}", imgName)
output, err := cmd.Output()
if err != nil {
klog.Infof("couldn't find image digest %s from local podman: %v ", imgName, err)
return ""
}
return strings.TrimSpace(string(output))
}

// DigestByGoLib gets image digest uses go-containerregistry lib
// which is 4s slower thabn local daemon per lookup https://github.com/google/go-containerregistry/issues/627
func DigestByGoLib(binary, imgName string) string {
func DigestByGoLib(imgName string) string {
ref, err := name.ParseReference(imgName, name.WeakValidation)
if err != nil {
klog.Infof("error parsing image name %s ref %v ", imgName, err)
return ""
}

daemonBinary = binary
img, _, err := retrieveImage(ref, imgName)
if err != nil {
klog.Infof("error retrieve Image %s ref %v ", imgName, err)
Expand Down Expand Up @@ -138,52 +125,30 @@ func ExistsImageInCache(img string) bool {
}

// ExistsImageInDaemon if img exist in local docker daemon
func ExistsImageInDaemon(binary, img string) bool {
func ExistsImageInDaemon(img string) bool {
// Check if image exists locally
switch binary {
case driver.Podman:
klog.Infof("Checking for %s in local podman", img)
cmd := exec.Command("sudo", "-n", "podman", "images", "--format", `{{$repository := .Repository}}{{$tag := .Tag}}{{range .RepoDigests}}{{$repository}}:{{$tag}}@{{.}}{{printf "\n"}}{{end}}`)
if output, err := cmd.Output(); err == nil {
if strings.Contains(string(output), img) {
klog.Infof("Found %s in local podman, skipping pull", img)
return true
}
}
case driver.Docker:
klog.Infof("Checking for %s in local docker daemon", img)
cmd := exec.Command("docker", "images", "--format", "{{.Repository}}:{{.Tag}}@{{.Digest}}")
if output, err := cmd.Output(); err == nil {
if strings.Contains(string(output), img) {
klog.Infof("Found %s in local docker daemon, skipping pull", img)
return true
}
klog.Infof("Checking for %s in local docker daemon", img)
cmd := exec.Command("docker", "images", "--format", "{{.Repository}}:{{.Tag}}@{{.Digest}}")
if output, err := cmd.Output(); err == nil {
if strings.Contains(string(output), img) {
klog.Infof("Found %s in local docker daemon, skipping pull", img)
return true
}
}
// Else, pull it
return false
}

// LoadFromTarball checks if the image exists as a tarball and tries to load it to the local daemon
// TODO: Pass in if we are loading to docker or podman so this function can also be used for podman
func LoadFromTarball(binary, img string) error {
p := filepath.Join(constants.ImageCacheDir, img)
p = localpath.SanitizeCacheDir(p)

switch binary {
case driver.Podman:
tag, err := name.NewTag(Tag(img))
if err != nil {
return errors.Wrap(err, "new tag")
}

i, err := tarball.ImageFromPath(p, &tag)
if err != nil {
return errors.Wrap(err, "tarball")
}

_, err = PodmanWrite(tag, i)
return err
case driver.Docker:
return fmt.Errorf("not yet implemented, see issue #8426")
default:
tag, err := name.NewTag(Tag(img))
if err != nil {
return errors.Wrap(err, "new tag")
Expand All @@ -197,7 +162,7 @@ func LoadFromTarball(binary, img string) error {
_, err = daemon.Write(tag, i)
return err
}
return fmt.Errorf("unknown binary: %s", binary)

}

// Tag returns just the image with the tag
Expand Down Expand Up @@ -278,16 +243,11 @@ func WriteImageToCache(img string) error {
}

// WriteImageToDaemon write img to the local docker daemon
func WriteImageToDaemon(binary, img string) error {
func WriteImageToDaemon(img string) error {
// buffered channel
c := make(chan v1.Update, 200)

switch binary {
case driver.Podman:
klog.Infof("Writing %s to local podman", img)
case driver.Docker:
klog.Infof("Writing %s to local daemon", img)
}
klog.Infof("Writing %s to local daemon", img)
ref, err := name.ParseReference(img)
if err != nil {
return errors.Wrap(err, "parsing reference")
Expand Down Expand Up @@ -321,14 +281,7 @@ func WriteImageToDaemon(binary, img string) error {
p.SetWidth(79)

go func() {
switch binary {
case driver.Podman:
_, err = PodmanWrite(ref, i, tarball.WithProgress(c))
case driver.Docker:
_, err = daemon.Write(ref, i, tarball.WithProgress(c))
default:
err = fmt.Errorf("unknown binary: %s", binary)
}
_, err = daemon.Write(ref, i, tarball.WithProgress(c))
errchan <- err
}()
var update v1.Update
Expand Down Expand Up @@ -381,7 +334,7 @@ func retrieveImage(ref name.Reference, imgName string) (v1.Image, string, error)
klog.Infof("short name: %s", imgName)
}
}
img, err = retrieveDaemon(daemonBinary, ref)
img, err = retrieveDaemon(ref)
if err == nil {
return img, imgName, nil
}
Expand All @@ -399,28 +352,15 @@ func retrieveImage(ref name.Reference, imgName string) (v1.Image, string, error)
return nil, "", err
}

func retrieveDaemon(binary string, ref name.Reference) (v1.Image, error) {
switch binary {
case driver.Podman:
img, err := PodmanImage(ref)
if err == nil {
klog.Infof("found %s locally: %+v", ref.Name(), img)
return img, nil
}
// reference does not exist in the local podman
klog.Infof("podman lookup for %+v: %v", ref, err)
return img, err
case driver.Docker:
img, err := daemon.Image(ref)
if err == nil {
klog.Infof("found %s locally: %+v", ref.Name(), img)
return img, nil
}
// reference does not exist in the local daemon
klog.Infof("daemon lookup for %+v: %v", ref, err)
return img, err
func retrieveDaemon(ref name.Reference) (v1.Image, error) {
img, err := daemon.Image(ref)
if err == nil {
klog.Infof("found %s locally: %+v", ref.Name(), img)
return img, nil
}
return nil, fmt.Errorf("unknown binary: %s", binary)
// reference does not exist in the local daemon
klog.Infof("daemon lookup for %+v: %v", ref, err)
return img, err
}

func retrieveRemote(ref name.Reference, p v1.Platform) (v1.Image, error) {
Expand Down
78 changes: 0 additions & 78 deletions pkg/minikube/image/podman.go

This file was deleted.

23 changes: 7 additions & 16 deletions pkg/minikube/machine/cache_images.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ func LoadCachedImages(cc *config.ClusterConfig, runner command.Runner, images []
// because it takes much less than that time to just transfer the image.
// This is needed because if running in offline mode, we can spend minutes here
// waiting for i/o timeout.
err := timedNeedsTransfer(cc.Driver, imgClient, image, cr, 10*time.Second)
err := timedNeedsTransfer(imgClient, image, cr, 10*time.Second)
if err == nil {
return nil
}
Expand All @@ -114,7 +114,7 @@ func LoadCachedImages(cc *config.ClusterConfig, runner command.Runner, images []
return nil
}

func timedNeedsTransfer(driver string, imgClient *client.Client, imgName string, cr cruntime.Manager, t time.Duration) error {
func timedNeedsTransfer(imgClient *client.Client, imgName string, cr cruntime.Manager, t time.Duration) error {
timeout := make(chan bool, 1)
go func() {
time.Sleep(t)
Expand All @@ -124,7 +124,7 @@ func timedNeedsTransfer(driver string, imgClient *client.Client, imgName string,
transferFinished := make(chan bool, 1)
var err error
go func() {
err = needsTransfer(driver, imgClient, imgName, cr)
err = needsTransfer(imgClient, imgName, cr)
transferFinished <- true
}()

Expand All @@ -137,9 +137,9 @@ func timedNeedsTransfer(driver string, imgClient *client.Client, imgName string,
}

// needsTransfer returns an error if an image needs to be retransfered
func needsTransfer(driver string, imgClient *client.Client, imgName string, cr cruntime.Manager) error {
imgDgst := "" // for instance sha256:7c92a2c6bbcb6b6beff92d0a940779769c2477b807c202954c537e2e0deb9bed
if driver == "docker" && imgClient != nil { // if possible try to get img digest from Client lib which is 4s faster.
func needsTransfer(imgClient *client.Client, imgName string, cr cruntime.Manager) error {
imgDgst := "" // for instance sha256:7c92a2c6bbcb6b6beff92d0a940779769c2477b807c202954c537e2e0deb9bed
if imgClient != nil { // if possible try to get img digest from Client lib which is 4s faster.
imgDgst = image.DigestByDockerLib(imgClient, imgName)
if imgDgst != "" {
if !cr.ImageExists(imgName, imgDgst) {
Expand All @@ -148,17 +148,8 @@ func needsTransfer(driver string, imgClient *client.Client, imgName string, cr c
return nil
}
}
if driver == "podman" {
imgDgst = image.DigestByPodmanExec(imgName)
if imgDgst != "" {
if !cr.ImageExists(imgName, imgDgst) {
return fmt.Errorf("%q does not exist at hash %q in container runtime", imgName, imgDgst)
}
return nil
}
}
// if not found with method above try go-container lib (which is 4s slower)
imgDgst = image.DigestByGoLib(driver, imgName)
imgDgst = image.DigestByGoLib(imgName)
if imgDgst == "" {
return fmt.Errorf("got empty img digest %q for %s", imgDgst, imgName)
}
Expand Down
26 changes: 13 additions & 13 deletions pkg/minikube/node/cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import (
"k8s.io/minikube/pkg/minikube/config"
"k8s.io/minikube/pkg/minikube/constants"
"k8s.io/minikube/pkg/minikube/download"
"k8s.io/minikube/pkg/minikube/driver"
"k8s.io/minikube/pkg/minikube/exit"
"k8s.io/minikube/pkg/minikube/image"
"k8s.io/minikube/pkg/minikube/localpath"
Expand Down Expand Up @@ -106,10 +107,6 @@ func doCacheBinaries(k8sVersion string) error {

// beginDownloadKicBaseImage downloads the kic image
func beginDownloadKicBaseImage(g *errgroup.Group, cc *config.ClusterConfig, downloadOnly bool) {
if image.ExistsImageInDaemon(cc.Driver, cc.KicBaseImage) {
klog.Infof("%s exists in daemon, skipping pull", cc.KicBaseImage)
return
}

klog.Infof("Beginning downloading kic base image for %s with %s", cc.Driver, cc.KubernetesConfig.ContainerRuntime)
register.Reg.SetStep(register.PullingBaseImage)
Expand Down Expand Up @@ -144,6 +141,7 @@ func beginDownloadKicBaseImage(g *errgroup.Group, cc *config.ClusterConfig, down
if downloadOnly {
return err
}

if err := image.LoadFromTarball(cc.Driver, img); err == nil {
klog.Infof("successfully loaded %s from cached tarball", img)
// strip the digest from the img before saving it in the config
Expand All @@ -152,15 +150,17 @@ func beginDownloadKicBaseImage(g *errgroup.Group, cc *config.ClusterConfig, down
return nil
}

klog.Infof("Downloading %s to local daemon", img)
if err = image.WriteImageToDaemon(cc.Driver, img); err == nil {
klog.Infof("successfully downloaded %s", img)
finalImg = img
return nil
}
if downloadOnly {
if err := image.SaveToDir([]string{img}, constants.ImageCacheDir); err == nil {
klog.Infof("successfully saved %s as a tarball", img)
if driver.IsDocker(cc.Driver) {
if image.ExistsImageInDaemon(img) {
klog.Infof("%s exists in daemon, skipping pull", img)
finalImg = img
return nil
}

klog.Infof("Downloading %s to local daemon", img)
err = image.WriteImageToDaemon(img)
if err == nil {
klog.Infof("successfully downloaded %s", img)
finalImg = img
return nil
}
Expand Down

0 comments on commit 329a1fb

Please sign in to comment.