Merge pull request #6571 from vbatts/vbatts-raw_json

raw json for `docker save`
This commit is contained in:
unclejack 2014-06-20 23:55:10 +03:00
commit a5f5d5e8d7
6 changed files with 88 additions and 12 deletions

View File

@ -860,7 +860,7 @@ func getContainersByName(eng *engine.Engine, version version.Version, w http.Res
} }
var job = eng.Job("container_inspect", vars["name"]) var job = eng.Job("container_inspect", vars["name"])
if version.LessThan("1.12") { if version.LessThan("1.12") {
job.SetenvBool("dirty", true) job.SetenvBool("raw", true)
} }
streamJSON(job, w, false) streamJSON(job, w, false)
return job.Run() return job.Run()
@ -872,7 +872,7 @@ func getImagesByName(eng *engine.Engine, version version.Version, w http.Respons
} }
var job = eng.Job("image_inspect", vars["name"]) var job = eng.Job("image_inspect", vars["name"])
if version.LessThan("1.12") { if version.LessThan("1.12") {
job.SetenvBool("dirty", true) job.SetenvBool("raw", true)
} }
streamJSON(job, w, false) streamJSON(job, w, false)
return job.Run() return job.Run()

View File

@ -15,7 +15,7 @@ func (daemon *Daemon) ContainerInspect(job *engine.Job) engine.Status {
if container := daemon.Get(name); container != nil { if container := daemon.Get(name); container != nil {
container.Lock() container.Lock()
defer container.Unlock() defer container.Unlock()
if job.GetenvBool("dirty") { if job.GetenvBool("raw") {
b, err := json.Marshal(&struct { b, err := json.Marshal(&struct {
*Container *Container
HostConfig *runconfig.HostConfig HostConfig *runconfig.HostConfig

View File

@ -1,7 +1,6 @@
package graph package graph
import ( import (
"encoding/json"
"io" "io"
"github.com/dotcloud/docker/engine" "github.com/dotcloud/docker/engine"
@ -135,8 +134,8 @@ func (s *TagStore) CmdLookup(job *engine.Job) engine.Status {
} }
name := job.Args[0] name := job.Args[0]
if image, err := s.LookupImage(name); err == nil && image != nil { if image, err := s.LookupImage(name); err == nil && image != nil {
if job.GetenvBool("dirty") { if job.GetenvBool("raw") {
b, err := json.Marshal(image) b, err := image.RawJson()
if err != nil { if err != nil {
return job.Error(err) return job.Error(err)
} }

View File

@ -149,6 +149,22 @@ func jsonPath(root string) string {
return path.Join(root, "json") 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. // TarLayer returns a tar archive of the image's filesystem layer.
func (img *Image) TarLayer() (arch archive.Archive, err error) { func (img *Image) TarLayer() (arch archive.Archive, err error) {
if img.graph == nil { if img.graph == nil {

View File

@ -7,8 +7,8 @@ import (
"testing" "testing"
) )
// save a repo and try to load it // save a repo and try to load it using stdout
func TestSaveAndLoadRepo(t *testing.T) { func TestSaveAndLoadRepoStdout(t *testing.T) {
runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true") runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
out, _, err := runCommandWithOutput(runCmd) out, _, err := runCommandWithOutput(runCmd)
errorOut(err, t, fmt.Sprintf("failed to create a container: %v %v", out, err)) errorOut(err, t, fmt.Sprintf("failed to create a container: %v %v", out, err))
@ -25,6 +25,10 @@ func TestSaveAndLoadRepo(t *testing.T) {
out, _, err = runCommandWithOutput(commitCmd) out, _, err = runCommandWithOutput(commitCmd)
errorOut(err, t, fmt.Sprintf("failed to commit container: %v %v", out, err)) 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` saveCmdTemplate := `%v save %v > /tmp/foobar-save-load-test.tar`
saveCmdFinal := fmt.Sprintf(saveCmdTemplate, dockerBinary, repoName) saveCmdFinal := fmt.Sprintf(saveCmdTemplate, dockerBinary, repoName)
saveCmd := exec.Command("bash", "-c", saveCmdFinal) saveCmd := exec.Command("bash", "-c", saveCmdFinal)
@ -39,14 +43,70 @@ func TestSaveAndLoadRepo(t *testing.T) {
errorOut(err, t, fmt.Sprintf("failed to load repo: %v %v", out, err)) errorOut(err, t, fmt.Sprintf("failed to load repo: %v %v", out, err))
inspectCmd = exec.Command(dockerBinary, "inspect", repoName) inspectCmd = exec.Command(dockerBinary, "inspect", repoName)
out, _, err = runCommandWithOutput(inspectCmd) after, _, err := runCommandWithOutput(inspectCmd)
errorOut(err, t, fmt.Sprintf("the repo should exist after loading it: %v %v", out, err)) 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) deleteContainer(cleanedContainerID)
deleteImages(repoName) deleteImages(repoName)
os.Remove("/tmp/foobar-save-load-test.tar") os.Remove("/tmp/foobar-save-load-test.tar")
logDone("save - save a repo") logDone("save - save a repo using stdout")
logDone("load - load a repo") 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")
} }

View File

@ -410,6 +410,7 @@ func (srv *Server) exportImage(eng *engine.Engine, name, tempdir string) error {
return err return err
} }
job := eng.Job("image_inspect", n) job := eng.Job("image_inspect", n)
job.SetenvBool("raw", true)
job.Stdout.Add(json) job.Stdout.Add(json)
if err := job.Run(); err != nil { if err := job.Run(); err != nil {
return err return err