diff --git a/image/tarexport/load.go b/image/tarexport/load.go index 22e6442dfb..59a499d6e3 100644 --- a/image/tarexport/load.go +++ b/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/integration-cli/docker_cli_save_load_test.go b/integration-cli/docker_cli_save_load_test.go index 514c040c53..869bf6bf88 100644 --- a/integration-cli/docker_cli_save_load_test.go +++ b/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:") +}