From 3e4e8636c1b05626cae720b47ef99109077e1d3a Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Tue, 17 Jun 2014 00:06:21 +0000 Subject: [PATCH 1/4] do not alter json in docker save Docker-DCO-1.1-Signed-off-by: Victor Vieux (github: vieux) --- api/server/server.go | 4 ++-- daemon/inspect.go | 2 +- graph/service.go | 2 +- server/server.go | 1 + 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/api/server/server.go b/api/server/server.go index 61407b2648..c6275177bc 100644 --- a/api/server/server.go +++ b/api/server/server.go @@ -855,7 +855,7 @@ func getContainersByName(eng *engine.Engine, version version.Version, w http.Res } var job = eng.Job("container_inspect", vars["name"]) if version.LessThan("1.12") { - job.SetenvBool("dirty", true) + job.SetenvBool("raw", true) } streamJSON(job, w, false) return job.Run() @@ -867,7 +867,7 @@ func getImagesByName(eng *engine.Engine, version version.Version, w http.Respons } var job = eng.Job("image_inspect", vars["name"]) if version.LessThan("1.12") { - job.SetenvBool("dirty", true) + job.SetenvBool("raw", true) } streamJSON(job, w, false) return job.Run() diff --git a/daemon/inspect.go b/daemon/inspect.go index af6d4520fb..6c4b74d6f2 100644 --- a/daemon/inspect.go +++ b/daemon/inspect.go @@ -15,7 +15,7 @@ func (daemon *Daemon) ContainerInspect(job *engine.Job) engine.Status { if container := daemon.Get(name); container != nil { container.Lock() defer container.Unlock() - if job.GetenvBool("dirty") { + if job.GetenvBool("raw") { b, err := json.Marshal(&struct { *Container HostConfig *runconfig.HostConfig diff --git a/graph/service.go b/graph/service.go index 4bce6b5645..ebdb881603 100644 --- a/graph/service.go +++ b/graph/service.go @@ -135,7 +135,7 @@ func (s *TagStore) CmdLookup(job *engine.Job) engine.Status { } name := job.Args[0] if image, err := s.LookupImage(name); err == nil && image != nil { - if job.GetenvBool("dirty") { + if job.GetenvBool("raw") { b, err := json.Marshal(image) if err != nil { return job.Error(err) diff --git a/server/server.go b/server/server.go index 76a51e796f..b054911ed8 100644 --- a/server/server.go +++ b/server/server.go @@ -433,6 +433,7 @@ func (srv *Server) exportImage(eng *engine.Engine, name, tempdir string) error { return err } job := eng.Job("image_inspect", n) + job.SetenvBool("raw", true) job.Stdout.Add(json) if err := job.Run(); err != nil { return err From 614c57c52161c0440247a4e4e36808116214770e Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Tue, 17 Jun 2014 00:59:51 +0000 Subject: [PATCH 2/4] improve test Docker-DCO-1.1-Signed-off-by: Victor Vieux (github: vieux) --- integration-cli/docker_cli_save_load_test.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/integration-cli/docker_cli_save_load_test.go b/integration-cli/docker_cli_save_load_test.go index d728c7de95..3dc5b8d010 100644 --- a/integration-cli/docker_cli_save_load_test.go +++ b/integration-cli/docker_cli_save_load_test.go @@ -25,6 +25,10 @@ func TestSaveAndLoadRepo(t *testing.T) { out, _, err = runCommandWithOutput(commitCmd) errorOut(err, t, fmt.Sprintf("failed to commit container: %v %v", out, err)) + inspectCmd = exec.Command(dockerBinary, "inspect", repoName) + before, _, err := runCommandWithOutput(inspectCmd) + errorOut(err, t, fmt.Sprintf("the repo should exist before saving it: %v %v", before, err)) + saveCmdTemplate := `%v save %v > /tmp/foobar-save-load-test.tar` saveCmdFinal := fmt.Sprintf(saveCmdTemplate, dockerBinary, repoName) saveCmd := exec.Command("bash", "-c", saveCmdFinal) @@ -39,8 +43,12 @@ func TestSaveAndLoadRepo(t *testing.T) { errorOut(err, t, fmt.Sprintf("failed to load repo: %v %v", out, err)) inspectCmd = exec.Command(dockerBinary, "inspect", repoName) - out, _, err = runCommandWithOutput(inspectCmd) - errorOut(err, t, fmt.Sprintf("the repo should exist after loading it: %v %v", out, err)) + after, _, err := runCommandWithOutput(inspectCmd) + errorOut(err, t, fmt.Sprintf("the repo should exist after loading it: %v %v", after, err)) + + if before != after { + t.Fatalf("inspect is not the same after a save / load") + } deleteContainer(cleanedContainerID) deleteImages(repoName) From 6228761f67bb5f2af6c3105de556fa3fedb12069 Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Tue, 17 Jun 2014 01:01:38 +0000 Subject: [PATCH 3/4] add a test using the flags Docker-DCO-1.1-Signed-off-by: Victor Vieux (github: vieux) --- integration-cli/docker_cli_save_load_test.go | 60 ++++++++++++++++++-- 1 file changed, 56 insertions(+), 4 deletions(-) diff --git a/integration-cli/docker_cli_save_load_test.go b/integration-cli/docker_cli_save_load_test.go index 3dc5b8d010..fb94cad9d8 100644 --- a/integration-cli/docker_cli_save_load_test.go +++ b/integration-cli/docker_cli_save_load_test.go @@ -7,8 +7,8 @@ import ( "testing" ) -// save a repo and try to load it -func TestSaveAndLoadRepo(t *testing.T) { +// save a repo and try to load it using stdout +func TestSaveAndLoadRepoStdout(t *testing.T) { runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true") out, _, err := runCommandWithOutput(runCmd) errorOut(err, t, fmt.Sprintf("failed to create a container: %v %v", out, err)) @@ -55,6 +55,58 @@ func TestSaveAndLoadRepo(t *testing.T) { os.Remove("/tmp/foobar-save-load-test.tar") - logDone("save - save a repo") - logDone("load - load a repo") + logDone("save - save a repo using stdout") + logDone("load - load a repo using stdout") +} + +// save a repo and try to load it using flags +func TestSaveAndLoadRepoFlags(t *testing.T) { + runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true") + out, _, err := runCommandWithOutput(runCmd) + errorOut(err, t, fmt.Sprintf("failed to create a container: %v %v", out, err)) + + cleanedContainerID := stripTrailingCharacters(out) + + repoName := "foobar-save-load-test" + + inspectCmd := exec.Command(dockerBinary, "inspect", cleanedContainerID) + out, _, err = runCommandWithOutput(inspectCmd) + errorOut(err, t, fmt.Sprintf("output should've been a container id: %v %v", cleanedContainerID, err)) + + commitCmd := exec.Command(dockerBinary, "commit", cleanedContainerID, repoName) + out, _, err = runCommandWithOutput(commitCmd) + errorOut(err, t, fmt.Sprintf("failed to commit container: %v %v", out, err)) + + inspectCmd = exec.Command(dockerBinary, "inspect", repoName) + before, _, err := runCommandWithOutput(inspectCmd) + errorOut(err, t, fmt.Sprintf("the repo should exist before saving it: %v %v", before, err)) + + saveCmdTemplate := `%v save -o /tmp/foobar-save-load-test.tar %v` + saveCmdFinal := fmt.Sprintf(saveCmdTemplate, dockerBinary, repoName) + saveCmd := exec.Command("bash", "-c", saveCmdFinal) + out, _, err = runCommandWithOutput(saveCmd) + errorOut(err, t, fmt.Sprintf("failed to save repo: %v %v", out, err)) + + deleteImages(repoName) + + loadCmdFinal := `docker load -i /tmp/foobar-save-load-test.tar` + loadCmd := exec.Command("bash", "-c", loadCmdFinal) + out, _, err = runCommandWithOutput(loadCmd) + errorOut(err, t, fmt.Sprintf("failed to load repo: %v %v", out, err)) + + inspectCmd = exec.Command(dockerBinary, "inspect", repoName) + after, _, err := runCommandWithOutput(inspectCmd) + errorOut(err, t, fmt.Sprintf("the repo should exist after loading it: %v %v", after, err)) + + if before != after { + t.Fatalf("inspect is not the same after a save / load") + } + + deleteContainer(cleanedContainerID) + deleteImages(repoName) + + os.Remove("/tmp/foobar-save-load-test.tar") + + logDone("save - save a repo using -o") + logDone("load - load a repo using -i") } From d3bc787bca62edff384e06a12224be2d982353da Mon Sep 17 00:00:00 2001 From: Vincent Batts Date: Tue, 17 Jun 2014 09:05:29 -0400 Subject: [PATCH 4/4] docker save: raw json Docker-DCO-1.1-Signed-off-by: Vincent Batts (github: vbatts) --- graph/service.go | 3 +-- image/image.go | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/graph/service.go b/graph/service.go index ebdb881603..3201d6b994 100644 --- a/graph/service.go +++ b/graph/service.go @@ -1,7 +1,6 @@ package graph import ( - "encoding/json" "io" "github.com/dotcloud/docker/engine" @@ -136,7 +135,7 @@ func (s *TagStore) CmdLookup(job *engine.Job) engine.Status { name := job.Args[0] if image, err := s.LookupImage(name); err == nil && image != nil { if job.GetenvBool("raw") { - b, err := json.Marshal(image) + b, err := image.RawJson() if err != nil { return job.Error(err) } diff --git a/image/image.go b/image/image.go index b56cbf08ee..5c250947ce 100644 --- a/image/image.go +++ b/image/image.go @@ -149,6 +149,22 @@ func jsonPath(root string) string { return path.Join(root, "json") } +func (img *Image) RawJson() ([]byte, error) { + root, err := img.root() + if err != nil { + return nil, fmt.Errorf("Failed to get root for image %s: %s", img.ID, err) + } + fh, err := os.Open(jsonPath(root)) + if err != nil { + return nil, fmt.Errorf("Failed to open json for image %s: %s", img.ID, err) + } + buf, err := ioutil.ReadAll(fh) + if err != nil { + return nil, fmt.Errorf("Failed to read json for image %s: %s", img.ID, err) + } + return buf, nil +} + // TarLayer returns a tar archive of the image's filesystem layer. func (img *Image) TarLayer() (arch archive.Archive, err error) { if img.graph == nil {