From a3be33ddb5d39e49ffcde10e0be49a2a580bbf4d Mon Sep 17 00:00:00 2001 From: Doug Davis Date: Wed, 25 May 2016 18:25:12 -0700 Subject: [PATCH 1/2] Say something useful during docker load During a `docker load` there are times when nothing is printed to the screen, leaving the user with no idea whether something happened. When something *is* printed, often its just something like: ``` 1834950e52ce: Loading layer 1.311 MB/1.311 MB 5f70bf18a086: Loading layer 1.024 kB/1.024 kB ``` which isn't necessarily the same as the image IDs. This PR will either show: - all of the tags for the image, or - all of the image IDs if there are no tags Sample output: ``` $ docker load -i busybox.tar Loaded image: busybox:latest $ docker load -i a.tar Loaded image ID: sha256:47bcc53f74dc94b1920f0b34f6036096526296767650f223433fe65c35f149eb ``` IOW, show the human-friendly stuff first and then only if there are no tags default back to the image IDs, so they have something to work with. For me this this is needed because I have lots of images and after a recent `docker load` I had no idea what image I just imported and had a hard time figuring it out. This should fix that by telling the user which images they just imported. I'll add tests once there's agreement that we want this change. Signed-off-by: Doug Davis Upstream-commit: 6986a3220fe59146eeddeaa865561472abc7baeb Component: engine --- components/engine/image/tarexport/load.go | 10 +++++++ .../docker_cli_save_load_test.go | 30 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/components/engine/image/tarexport/load.go b/components/engine/image/tarexport/load.go index 22e6442dfb..59a499d6e3 100644 --- a/components/engine/image/tarexport/load.go +++ b/components/engine/image/tarexport/load.go @@ -62,6 +62,8 @@ func (l *tarexporter) Load(inTar io.ReadCloser, outStream io.Writer, quiet bool) } var parentLinks []parentLink + var imageIDsStr string + var imageRefCount int for _, m := range manifest { configPath, err := safePath(tmpDir, m.Config) @@ -109,7 +111,9 @@ func (l *tarexporter) Load(inTar io.ReadCloser, outStream io.Writer, quiet bool) if err != nil { return err } + imageIDsStr += fmt.Sprintf("Loaded image ID: %s\n", imgID) + imageRefCount = 0 for _, repoTag := range m.RepoTags { named, err := reference.ParseNamed(repoTag) if err != nil { @@ -120,6 +124,8 @@ func (l *tarexporter) Load(inTar io.ReadCloser, outStream io.Writer, quiet bool) return fmt.Errorf("invalid tag %q", repoTag) } l.setLoadedTag(ref, imgID, outStream) + outStream.Write([]byte(fmt.Sprintf("Loaded image: %s\n", ref))) + imageRefCount++ } parentLinks = append(parentLinks, parentLink{imgID, m.Parent}) @@ -134,6 +140,10 @@ func (l *tarexporter) Load(inTar io.ReadCloser, outStream io.Writer, quiet bool) } } + if imageRefCount == 0 { + outStream.Write([]byte(imageIDsStr)) + } + return nil } diff --git a/components/engine/integration-cli/docker_cli_save_load_test.go b/components/engine/integration-cli/docker_cli_save_load_test.go index 514c040c53..869bf6bf88 100644 --- a/components/engine/integration-cli/docker_cli_save_load_test.go +++ b/components/engine/integration-cli/docker_cli_save_load_test.go @@ -350,3 +350,33 @@ func (s *DockerSuite) TestSaveLoadParents(c *check.C) { inspectOut = inspectField(c, idFoo, "Parent") c.Assert(inspectOut, checker.Equals, "") } + +func (s *DockerSuite) TestSaveLoadNoTag(c *check.C) { + testRequires(c, DaemonIsLinux) + + name := "saveloadnotag" + + _, err := buildImage(name, "FROM busybox\nENV foo=bar", true) + c.Assert(err, checker.IsNil, check.Commentf("%v", err)) + + id := inspectField(c, name, "Id") + + // Test to make sure that save w/o name just shows imageID during load + out, _, err := runCommandPipelineWithOutput( + exec.Command(dockerBinary, "save", id), + exec.Command(dockerBinary, "load")) + c.Assert(err, checker.IsNil, check.Commentf("failed to save and load repo: %s, %v", out, err)) + + // Should not show 'name' but should show the image ID during the load + c.Assert(out, checker.Not(checker.Contains), "Loaded image: ") + c.Assert(out, checker.Contains, "Loaded image ID:") + c.Assert(out, checker.Contains, id) + + // Test to make sure that save by name shows that name during load + out, _, err = runCommandPipelineWithOutput( + exec.Command(dockerBinary, "save", name), + exec.Command(dockerBinary, "load")) + c.Assert(err, checker.IsNil, check.Commentf("failed to save and load repo: %s, %v", out, err)) + c.Assert(out, checker.Contains, "Loaded image: "+name+":latest") + c.Assert(out, checker.Not(checker.Contains), "Loaded image ID:") +} From 5988d92124501607bbb684641e0c484db064adba Mon Sep 17 00:00:00 2001 From: Vincent Demeester Date: Wed, 8 Jun 2016 17:40:37 +0200 Subject: [PATCH 2/2] Update docker-load documentation Signed-off-by: Vincent Demeester Upstream-commit: 9b5e0ea7dedac3c1cbbaf6770aa6834c8e7b7774 Component: engine --- components/engine/docs/reference/commandline/load.md | 12 ++++++++++-- components/engine/man/docker-load.1.md | 11 +++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/components/engine/docs/reference/commandline/load.md b/components/engine/docs/reference/commandline/load.md index 0b40fde2f3..60f4076c77 100644 --- a/components/engine/docs/reference/commandline/load.md +++ b/components/engine/docs/reference/commandline/load.md @@ -12,11 +12,12 @@ parent = "smn_cli" Usage: docker load [OPTIONS] - Load an image from a tar archive or STDIN + Load an image from a tar archive or STDIN and shows image names or + IDs imported. --help Print usage -i, --input="" Read from a tar archive file, instead of STDIN. The tarball may be compressed with gzip, bzip, or xz - -q, --quiet Suppress the load output. Without this option, a progress bar is displayed. + -q, --quiet Suppress the load progress bar but still outputs the imported images Loads a tarred repository from a file or the standard input stream. Restores both images and tags. @@ -24,10 +25,17 @@ Restores both images and tags. $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE $ docker load < busybox.tar.gz + # […] + Loaded image: busybox:latest $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest 769b9341d937 7 weeks ago 2.489 MB $ docker load --input fedora.tar + # […] + Loaded image: fedora:rawhide + # […] + Loaded image: fedora:20 + # […] $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest 769b9341d937 7 weeks ago 2.489 MB diff --git a/components/engine/man/docker-load.1.md b/components/engine/man/docker-load.1.md index c54fe607b9..b165173047 100644 --- a/components/engine/man/docker-load.1.md +++ b/components/engine/man/docker-load.1.md @@ -13,7 +13,8 @@ docker-load - Load an image from a tar archive or STDIN # DESCRIPTION Loads a tarred repository from a file or the standard input stream. -Restores both images and tags. +Restores both images and tags. Write image names or IDs imported it +standard output stream. # OPTIONS **--help** @@ -23,7 +24,7 @@ Restores both images and tags. Read from a tar archive file, instead of STDIN. The tarball may be compressed with gzip, bzip, or xz. **-q**, **--quiet** - Suppress the load output. Without this option, a progress bar is displayed. + Suppress the load progress bar but still outputs the imported images. # EXAMPLES @@ -31,6 +32,11 @@ Restores both images and tags. REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest 769b9341d937 7 weeks ago 2.489 MB $ docker load --input fedora.tar + # […] + Loaded image: fedora:rawhide + # […] + Loaded image: fedora:20 + # […] $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest 769b9341d937 7 weeks ago 2.489 MB @@ -47,3 +53,4 @@ April 2014, Originally compiled by William Henry (whenry at redhat dot com) based on docker.com source material and internal work. June 2014, updated by Sven Dowideit July 2015 update by Mary Anthony +June 2016 update by Vincent Demeester