Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: fix empty tarball when generating image save #19312

Merged
merged 1 commit into from
Aug 7, 2024

Conversation

ComradeProgrammer
Copy link
Member

@ComradeProgrammer ComradeProgrammer commented Jul 21, 2024

FIX #19233

What happened:

  1. The direct reason why medya had to prefix docker.io in integration test was: When using contained runtime for minikube, if we try to look for an image kicbase/echo-server:latest without prefix docker.io, minikube will not fail. Instead, it will generate an empty tarball.

You can use the following instructions to reproduce this bug:

./out/minikube image load kicbase/echo-server #load the image into minikube
./out/minikube image save kicbase/echo-server:latest ech2
 du -h ech2

You will find that the size of tarball is 0

  1. The actual reason why this happened is the flawed implementation of func (r *Containerd) ImageExists(name string, sha string) bool in pkg/minikube/cruntime/containerd.go

Original ImageExists use ctr images check to list all images, and then check whether the given image name appears in the stdout. However, the output for command ctr -n "k8s.io" image check is something like this

docker@minikube:~$ sudo ctr -n=k8s.io images list
REF                                                                                                             TYPE                                                      DIGEST                                                                  SIZE      PLATFORMS                                                                    LABELS
docker.io/kicbase/echo-server:latest                                                                            application/vnd.oci.image.manifest.v1+json                sha256:b9f1cd6bd0f1e9e4de9e9fb198be91f9f6e78e61d5d40e85c2c5165ae1d67075 4.6 MiB   linux/arm64                                                                  io.cri-containerd.image=managed

...

That means both ImageExists("docker.io/kicbase/echo-server:latest") and ImageExists("kicbase/echo-server:latest") will return true, even we expect the latter one to return a false

  1. According to the official reply in github discussion of contained (Cannot check image by name using ctr. containerd/containerd#5334), The correct way to check the existence of the image is using ctr -n "k8s.io" image list "name=xxxxxxxxxxxxxx". So I revised this function to do so.

  2. Now ImageExists("kicbase/echo-server:latest") will return a false. However, we want minikube image save kicbase/echo-server:latest ech2 to success. So I reused existing logic to add docker.io prefix and retry if no registry is specified.

  3. After making the modification above, crio tests are still found to be broken. The reason is that when the image does not exist, and it does not start with "docker.io", crictl treats it as localhost and returns, crictl returns

docker@minikube:~$ sudo crictl rmi kicbase/echo-server:latest
E0728 22:18:38.259737    3975 remote_image.go:187] "Get ImageStatus from image service failed" err="rpc error: code = Unknown desc = short-name \"kicbase/echo-server:latest\" did not resolve to an alias and no unqualified-search registries are defined in \"/etc/containers/registries.conf\"" image="kicbase/echo-server:latest"
ERRO[0000] image status request for "kicbase/echo-server:latest" failed: rpc error: code = Unknown desc = short-name "kicbase/echo-server:latest" did not resolve to an alias and no unqualified-search registries are defined in "/etc/containers/registries.conf" 
FATA[0000] unable to remove the image(s)   

so the logic in func removeExistingImage(r cruntime.Manager, src string, imgName string) error of pkg/minikube/machine/cache_images.go is incomplete, and it return nil even if the image does not exist Then the image (without docker.io prefix) is regarded as existing image, and the load process abort.

Before&After:

Before:

  • ./out/minikube image save kicbase/echo-server:latest ech2 generates an empty tarball
 ./out/minikube image load kicbase/echo-server #load the image into minikube
./out/minikube image save kicbase/echo-server:latest ech2
 du -h ech2
0B    ech2
  • cannot pass integration test with const echoServerImg = "kicbase/echo-server"

After:

  • ./out/minikube image save kicbase/echo-server:latest ech2 generates correct tarball
 ./out/minikube image load kicbase/echo-server #load the image into minikube
./out/minikube image save kicbase/echo-server:latest ech2
 du -h ech2
2.1M    ech2
  • can pass integration test with const echoServerImg = "kicbase/echo-server"

@k8s-ci-robot k8s-ci-robot added the cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. label Jul 21, 2024
@ComradeProgrammer ComradeProgrammer requested review from medyagh and removed request for medyagh July 21, 2024 22:34
@k8s-ci-robot k8s-ci-robot added the size/S Denotes a PR that changes 10-29 lines, ignoring generated files. label Jul 21, 2024
@ComradeProgrammer
Copy link
Member Author

/ok-to-test

@k8s-ci-robot k8s-ci-robot added the ok-to-test Indicates a non-member PR verified by an org member that is safe to test. label Jul 21, 2024
@minikube-pr-bot

This comment has been minimized.

@minikube-pr-bot
Copy link

Here are the number of top 10 failed tests in each environments with lowest flake rate.

Environment Test Name Flake Rate
Docker_Linux_crio (7 failed) TestFunctional/parallel/ImageCommands/ImageReloadDaemon(gopogh) 0.00% (chart)
Docker_Linux_crio (7 failed) TestFunctional/parallel/ImageCommands/ImageTagAndLoadDaemon(gopogh) 0.00% (chart)
Docker_Linux_crio (7 failed) TestFunctional/parallel/ImageCommands/ImageSaveToFile(gopogh) 0.00% (chart)
Docker_Linux_crio (7 failed) TestFunctional/parallel/ImageCommands/ImageLoadDaemon(gopogh) 1.96% (chart)
Docker_Linux_crio (7 failed) TestFunctional/parallel/ImageCommands/ImageLoadFromFile(gopogh) 3.27% (chart)
Hyperkit_macOS (1 failed) TestNetworkPlugins/group/false/Start(gopogh) 8.47% (chart)
Docker_Linux_crio_arm64 (8 failed) TestFunctional/parallel/ImageCommands/ImageLoadDaemon(gopogh) 0.00% (chart)
Docker_Linux_crio_arm64 (8 failed) TestFunctional/parallel/ImageCommands/ImageReloadDaemon(gopogh) 0.00% (chart)
Docker_Linux_crio_arm64 (8 failed) TestFunctional/parallel/ImageCommands/ImageTagAndLoadDaemon(gopogh) 0.00% (chart)
Docker_Linux_crio_arm64 (8 failed) TestFunctional/parallel/ImageCommands/ImageSaveToFile(gopogh) 0.00% (chart)
Docker_Linux_crio_arm64 (8 failed) TestFunctional/parallel/ImageCommands/ImageLoadFromFile(gopogh) 0.00% (chart)
Docker_Linux_crio_arm64 (8 failed) TestFunctional/parallel/PersistentVolumeClaim(gopogh) 4.46% (chart)

Besides the following environments also have failed tests:

To see the flake rates of all tests by environment, click here.

@medyagh
Copy link
Member

medyagh commented Jul 23, 2024

@ComradeProgrammer excellent ! thank you for such a detailed PR description, please check the docker Linux CRIO tests
for imageLoad
https://storage.googleapis.com/minikube-builds/logs/19312/35447/Docker_Linux_crio.html#fail_TestFunctional%2fparallel%2fImageCommands%2fImageLoadDaemon

@k8s-ci-robot k8s-ci-robot added size/M Denotes a PR that changes 30-99 lines, ignoring generated files. and removed size/S Denotes a PR that changes 10-29 lines, ignoring generated files. labels Jul 29, 2024
@minikube-pr-bot

This comment has been minimized.

@minikube-pr-bot
Copy link

Here are the number of top 10 failed tests in each environments with lowest flake rate.

Environment Test Name Flake Rate
KVM_Linux_containerd (1 failed) TestFunctional/parallel/ImageCommands/ImageLoadFromFile(gopogh) 0.00% (chart)
Docker_Linux_containerd (1 failed) TestFunctional/parallel/ImageCommands/ImageLoadFromFile(gopogh) 0.00% (chart)
Docker_Linux_crio_arm64 (3 failed) TestMultiControlPlane/serial/RestartCluster(gopogh) 11.46% (chart)
Docker_Linux_containerd_arm64 (2 failed) TestFunctional/parallel/ImageCommands/ImageLoadFromFile(gopogh) 0.00% (chart)

Besides the following environments also have failed tests:

To see the flake rates of all tests by environment, click here.

Copy link
Member

@medyagh medyagh left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

plz take a look at this PR #19344

and let me know if we merge that PR or this, are they gonna affect each other

@ComradeProgrammer
Copy link
Member Author

docker@minikube:~$ sudo crictl image ls
IMAGE                                     TAG                  IMAGE ID            SIZE
docker.io/kicbase/echo-server             latest               ce2d2cda2d858       2.17MB
docker.io/kindest/kindnetd                v20240202-8f1494ea   4740c1948d3fc       25.3MB
gcr.io/k8s-minikube/storage-provisioner   v5                   ba04bb24b9575       8.03MB
registry.k8s.io/coredns/coredns           v1.11.1              2437cf7621777       16.5MB
registry.k8s.io/etcd                      3.5.12-0             014faa467e297       66.2MB
registry.k8s.io/kube-apiserver            v1.30.0              181f57fd3cdb7       29.9MB
registry.k8s.io/kube-controller-manager   v1.30.0              68feac521c0f1       28.3MB
registry.k8s.io/kube-proxy                v1.30.0              cb7eac0b42cc1       25.6MB
registry.k8s.io/kube-scheduler            v1.30.0              547adae34140b       17.6MB
registry.k8s.io/pause                     3.9                  829e9de338bd5       268kB
docker@minikube:~$ sudo ctr -n=k8s.io images check
REF                                                                                                             TYPE                                                      DIGEST                                                                  STATUS            SIZE              UNPACKED 
docker.io/kicbase/echo-server:latest                                                                            application/vnd.docker.distribution.manifest.v2+json      sha256:0fabc732ad18ac2e4eea22a8449cb04c9b96651282c688d76158012ce9bf53e9 complete (2/2)    2.1 MiB/2.1 MiB   true
docker.io/kindest/kindnetd:v20240202-8f1494ea                                                                   application/vnd.docker.distribution.manifest.list.v2+json sha256:61f9956af8019caf6dcc4d39b31857b868aaab80521432ddcc216b805c4f7988 incomplete (1/5)  1.2 KiB/24.2 MiB  true
docker.io/kindest/kindnetd@sha256:61f9956af8019caf6dcc4d39b31857b868aaab80521432ddcc216b805c4f7988              application/vnd.docker.distribution.manifest.list.v2+json sha256:61f9956af8019caf6dcc4d39b31857b868aaab80521432ddcc216b805c4f7988 incomplete (1/5)  1.2 KiB/24.2 MiB  true
gcr.io/k8s-minikube/storage-provisioner:v5                                                                      application/vnd.docker.distribution.manifest.list.v2+json sha256:18eb69d1418e854ad5a19e399310e52808a8321e4c441c1dddad8977a0d7a944 incomplete (1/2)  797.0 B/7.7 MiB   true
gcr.io/k8s-minikube/storage-provisioner@sha256:18eb69d1418e854ad5a19e399310e52808a8321e4c441c1dddad8977a0d7a944 application/vnd.docker.distribution.manifest.list.v2+json sha256:18eb69d1418e854ad5a19e399310e52808a8321e4c441c1dddad8977a0d7a944 incomplete (1/2)  797.0 B/7.7 MiB   true
registry.k8s.io/coredns/coredns:v1.11.1                                                                         application/vnd.docker.distribution.manifest.list.v2+json sha256:1eeb4c7316bacb1d4c8ead65571cd92dd21e27359f0d4917f1a5822a73b75db1 incomplete (1/12) 2.7 KiB/15.7 MiB  true
registry.k8s.io/coredns/coredns@sha256:1eeb4c7316bacb1d4c8ead65571cd92dd21e27359f0d4917f1a5822a73b75db1         application/vnd.docker.distribution.manifest.list.v2+json sha256:1eeb4c7316bacb1d4c8ead65571cd92dd21e27359f0d4917f1a5822a73b75db1 incomplete (1/12) 2.7 KiB/15.7 MiB  true
registry.k8s.io/etcd:3.5.12-0                                                                                   application/vnd.docker.distribution.manifest.list.v2+json sha256:44a8e24dcbba3470ee1fee21d5e88d128c936e9b55d4bc51fbef8086f8ed123b incomplete (1/13) 2.3 KiB/63.1 MiB  true
registry.k8s.io/etcd@sha256:44a8e24dcbba3470ee1fee21d5e88d128c936e9b55d4bc51fbef8086f8ed123b                    application/vnd.docker.distribution.manifest.list.v2+json sha256:44a8e24dcbba3470ee1fee21d5e88d128c936e9b55d4bc51fbef8086f8ed123b incomplete (1/13) 2.3 KiB/63.1 MiB  true
registry.k8s.io/kube-apiserver:v1.30.0                                                                          application/vnd.docker.distribution.manifest.list.v2+json sha256:6b8e197b2d39c321189a475ac755a77896e34b56729425590fbc99f3a96468a3 incomplete (1/14) 2.7 KiB/28.5 MiB  true
registry.k8s.io/kube-apiserver@sha256:6b8e197b2d39c321189a475ac755a77896e34b56729425590fbc99f3a96468a3          application/vnd.docker.distribution.manifest.list.v2+json sha256:6b8e197b2d39c321189a475ac755a77896e34b56729425590fbc99f3a96468a3 incomplete (1/14) 2.7 KiB/28.5 MiB  true
registry.k8s.io/kube-controller-manager:v1.30.0                                                                 application/vnd.docker.distribution.manifest.list.v2+json sha256:5f52f00f17d5784b5ca004dffca59710fa1a9eec8d54cebdf9433a1d134150fe incomplete (1/14) 2.6 KiB/27.0 MiB  true
registry.k8s.io/kube-controller-manager@sha256:5f52f00f17d5784b5ca004dffca59710fa1a9eec8d54cebdf9433a1d134150fe application/vnd.docker.distribution.manifest.list.v2+json sha256:5f52f00f17d5784b5ca004dffca59710fa1a9eec8d54cebdf9433a1d134150fe incomplete (1/14) 2.6 KiB/27.0 MiB  true
registry.k8s.io/kube-proxy:v1.30.0                                                                              application/vnd.docker.distribution.manifest.list.v2+json sha256:ec532ff47eaf39822387e51ec73f1f2502eb74658c6303319db88d2c380d0210 incomplete (1/3)  642.0 B/24.4 MiB  true
registry.k8s.io/kube-proxy@sha256:ec532ff47eaf39822387e51ec73f1f2502eb74658c6303319db88d2c380d0210              application/vnd.docker.distribution.manifest.list.v2+json sha256:ec532ff47eaf39822387e51ec73f1f2502eb74658c6303319db88d2c380d0210 incomplete (1/3)  642.0 B/24.4 MiB  true
registry.k8s.io/kube-scheduler:v1.30.0                                                                          application/vnd.docker.distribution.manifest.list.v2+json sha256:2353c3a1803229970fcb571cffc9b2f120372350e01c7381b4b650c4a02b9d67 incomplete (1/14) 2.6 KiB/16.7 MiB  true
registry.k8s.io/kube-scheduler@sha256:2353c3a1803229970fcb571cffc9b2f120372350e01c7381b4b650c4a02b9d67          application/vnd.docker.distribution.manifest.list.v2+json sha256:2353c3a1803229970fcb571cffc9b2f120372350e01c7381b4b650c4a02b9d67 incomplete (1/14) 2.6 KiB/16.7 MiB  true
registry.k8s.io/pause:3.9                                                                                       application/vnd.docker.distribution.manifest.list.v2+json sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097 incomplete (1/2)  973.0 B/258.9 KiB true
registry.k8s.io/pause@sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097                   application/vnd.docker.distribution.manifest.list.v2+json sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097 incomplete (1/2)  973.0 B/258.9 KiB true
sha256:014faa467e29798aeef733fe6d1a3b5e382688217b053ad23410e6cccd5d22fd                                         application/vnd.docker.distribution.manifest.list.v2+json sha256:44a8e24dcbba3470ee1fee21d5e88d128c936e9b55d4bc51fbef8086f8ed123b incomplete (1/13) 2.3 KiB/63.1 MiB  true
sha256:181f57fd3cdb796d3b94d5a1c86bf48ec261d75965d1b7c328f1d7c11f79f0bb                                         application/vnd.docker.distribution.manifest.list.v2+json sha256:6b8e197b2d39c321189a475ac755a77896e34b56729425590fbc99f3a96468a3 incomplete (1/14) 2.7 KiB/28.5 MiB  true
sha256:2437cf762177702dec2dfe99a09c37427a15af6d9a57c456b65352667c223d93                                         application/vnd.docker.distribution.manifest.list.v2+json sha256:1eeb4c7316bacb1d4c8ead65571cd92dd21e27359f0d4917f1a5822a73b75db1 incomplete (1/12) 2.7 KiB/15.7 MiB  true
sha256:4740c1948d3fceb8d7dacc63033aa6299d80794ee4f4811539ec1081d9211f3d                                         application/vnd.docker.distribution.manifest.list.v2+json sha256:61f9956af8019caf6dcc4d39b31857b868aaab80521432ddcc216b805c4f7988 incomplete (1/5)  1.2 KiB/24.2 MiB  true
sha256:547adae34140be47cdc0d9f3282b6184ef76154c44cf43fc7edd0685e61ab73a                                         application/vnd.docker.distribution.manifest.list.v2+json sha256:2353c3a1803229970fcb571cffc9b2f120372350e01c7381b4b650c4a02b9d67 incomplete (1/14) 2.6 KiB/16.7 MiB  true
sha256:68feac521c0f104bef927614ce0960d6fcddf98bd42f039c98b7d4a82294d6f1                                         application/vnd.docker.distribution.manifest.list.v2+json sha256:5f52f00f17d5784b5ca004dffca59710fa1a9eec8d54cebdf9433a1d134150fe incomplete (1/14) 2.6 KiB/27.0 MiB  true
sha256:829e9de338bd5fdd3f16f68f83a9fb288fbc8453e881e5d5cfd0f6f2ff72b43e                                         application/vnd.docker.distribution.manifest.list.v2+json sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097 incomplete (1/2)  973.0 B/258.9 KiB true
sha256:ba04bb24b95753201135cbc420b233c1b0b9fa2e1fd21d28319c348c33fbcde6                                         application/vnd.docker.distribution.manifest.list.v2+json sha256:18eb69d1418e854ad5a19e399310e52808a8321e4c441c1dddad8977a0d7a944 incomplete (1/2)  797.0 B/7.7 MiB   true
sha256:cb7eac0b42cc1efe8ef8d69652c7c0babbf9ab418daca7fe90ddb8b1ab68389f                                         application/vnd.docker.distribution.manifest.list.v2+json sha256:ec532ff47eaf39822387e51ec73f1f2502eb74658c6303319db88d2c380d0210 incomplete (1/3)  642.0 B/24.4 MiB  true
sha256:ce2d2cda2d858fdaea84129deb86d18e5dbf1c548f230b79fdca74cc91729d17                                         application/vnd.docker.distribution.manifest.v2+json      sha256:0fabc732ad18ac2e4eea22a8449cb04c9b96651282c688d76158012ce9bf53e9 complete (2/2)    2.1 MiB/2.1 MiB   true

docker@minikube:~$ sudo ctr -n=k8s.io images ls "name==docker.io/kicbase/echo-server:latest"
REF                                  TYPE                                                 DIGEST                                                                  SIZE    PLATFORMS   LABELS                          
docker.io/kicbase/echo-server:latest application/vnd.docker.distribution.manifest.v2+json sha256:0fabc732ad18ac2e4eea22a8449cb04c9b96651282c688d76158012ce9bf53e9 2.1 MiB linux/arm64 io.cri-containerd.image=managed 
docker@minikube:~$ sudo ctr -n=k8s.io images ls "name==kicbase/echo-server:latest"
REF TYPE DIGEST SIZE PLATFORMS LABELS 

@minikube-pr-bot

This comment has been minimized.

@minikube-pr-bot
Copy link

Here are the number of top 10 failed tests in each environments with lowest flake rate.

Environment Test Name Flake Rate
Docker_Linux_crio_arm64 (3 failed) TestFunctional/parallel/PersistentVolumeClaim(gopogh) 3.03% (chart)

Besides the following environments also have failed tests:

  • Docker_Linux_containerd_arm64: 1 failed (gopogh)

  • Docker_Cloud_Shell: 5 failed (gopogh)

  • Docker_Linux_crio: 2 failed (gopogh)

  • KVM_Linux_crio: 31 failed (gopogh)

To see the flake rates of all tests by environment, click here.

@minikube-pr-bot
Copy link

kvm2 driver with docker runtime

+----------------+----------+---------------------+
|    COMMAND     | MINIKUBE | MINIKUBE (PR 19312) |
+----------------+----------+---------------------+
| minikube start | 48.4s    | 48.0s               |
| enable ingress | 24.2s    | 24.4s               |
+----------------+----------+---------------------+

Times for minikube start: 49.8s 48.7s 46.1s 48.6s 48.7s
Times for minikube (PR 19312) start: 45.8s 49.0s 45.3s 51.5s 48.5s

Times for minikube ingress: 23.9s 24.9s 23.9s 24.4s 23.9s
Times for minikube (PR 19312) ingress: 23.4s 23.4s 23.9s 23.9s 27.4s

docker driver with docker runtime

+----------------+----------+---------------------+
|    COMMAND     | MINIKUBE | MINIKUBE (PR 19312) |
+----------------+----------+---------------------+
| minikube start | 22.3s    | 23.0s               |
| enable ingress | 22.0s    | 21.8s               |
+----------------+----------+---------------------+

Times for minikube start: 20.1s 25.1s 21.3s 23.9s 21.3s
Times for minikube (PR 19312) start: 21.0s 23.7s 24.7s 23.9s 21.6s

Times for minikube ingress: 21.7s 21.7s 21.8s 22.7s 22.2s
Times for minikube (PR 19312) ingress: 21.8s 21.2s 22.8s 21.2s 21.7s

docker driver with containerd runtime

+----------------+----------+---------------------+
|    COMMAND     | MINIKUBE | MINIKUBE (PR 19312) |
+----------------+----------+---------------------+
| minikube start | 22.0s    | 21.5s               |
| enable ingress | 43.2s    | 41.9s               |
+----------------+----------+---------------------+

Times for minikube start: 22.4s 20.9s 22.9s 23.2s 20.8s
Times for minikube (PR 19312) start: 21.0s 22.7s 20.0s 21.4s 22.6s

Times for minikube ingress: 48.2s 40.2s 31.8s 48.2s 47.7s
Times for minikube (PR 19312) ingress: 48.2s 33.2s 47.8s 32.2s 48.2s

@minikube-pr-bot
Copy link

Here are the number of top 10 failed tests in each environments with lowest flake rate.

Environment Test Name Flake Rate
KVM_Linux (1 failed) TestMountStart/serial/VerifyMountFirst(gopogh) 0.64% (chart)
KVM_Linux_containerd (1 failed) TestNoKubernetes/serial/ProfileList(gopogh) 0.00% (chart)
Docker_Linux_containerd_arm64 (2 failed) TestStartStop/group/old-k8s-version/serial/SecondStart(gopogh) 47.47% (chart)

Besides the following environments also have failed tests:

To see the flake rates of all tests by environment, click here.

@medyagh medyagh merged commit ab81991 into kubernetes:master Aug 7, 2024
23 of 37 checks passed
@k8s-ci-robot
Copy link
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: ComradeProgrammer, medyagh

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@k8s-ci-robot k8s-ci-robot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Aug 7, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
approved Indicates a PR has been approved by an approver from all required OWNERS files. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. ok-to-test Indicates a non-member PR verified by an org member that is safe to test. size/M Denotes a PR that changes 30-99 lines, ignoring generated files.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

minikube image save should assume docker.io if not specified
4 participants