From 4af8b711c0b86b38a851ec19b2a00e1317496924 Mon Sep 17 00:00:00 2001 From: Solomon Hykes Date: Thu, 21 Mar 2013 18:59:12 -0700 Subject: [PATCH 1/3] Fixed output quirks in 'docker images' --- commands.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/commands.go b/commands.go index 78d24ad0a0..4b23204854 100644 --- a/commands.go +++ b/commands.go @@ -454,7 +454,7 @@ func (srv *Server) CmdImages(stdin io.ReadCloser, stdout io.Writer, args ...stri } } // Display images which aren't part of a - if nameFilter != "" { + if nameFilter == "" { for id, image := range allImages { if !*quiet { for idx, field := range []string{ @@ -470,6 +470,7 @@ func (srv *Server) CmdImages(stdin io.ReadCloser, stdout io.Writer, args ...stri w.Write([]byte("\t" + field)) } } + w.Write([]byte{'\n'}) } else { stdout.Write([]byte(image.Id + "\n")) } From d0c776528b50f884c970cf0563ef6b40d90efc44 Mon Sep 17 00:00:00 2001 From: Solomon Hykes Date: Thu, 21 Mar 2013 19:00:43 -0700 Subject: [PATCH 2/3] Fix a bug which caused repository metadata to be cleared at startup --- tags.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tags.go b/tags.go index 908691a8f9..55a5135860 100644 --- a/tags.go +++ b/tags.go @@ -3,6 +3,7 @@ package docker import ( "encoding/json" "io/ioutil" + "os" "path/filepath" ) @@ -24,7 +25,12 @@ func NewTagStore(path string, graph *Graph) (*TagStore, error) { graph: graph, Repositories: make(map[string]Repository), } - if err := store.Save(); err != nil { + // Load the json file if it exists, otherwise create it. + if err := store.Reload(); os.IsNotExist(err) { + if err := store.Save(); err != nil { + return nil, err + } + } else if err != nil { return nil, err } return store, nil From 379d449c4417e505a3ea95a121680b318b757c46 Mon Sep 17 00:00:00 2001 From: Solomon Hykes Date: Thu, 21 Mar 2013 19:01:55 -0700 Subject: [PATCH 3/3] 'docker run' can reference an image by REPOSITORY:TAG --- graph.go | 1 + runtime.go | 39 +++++++++++++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/graph.go b/graph.go index 5001852c32..b0440518ad 100644 --- a/graph.go +++ b/graph.go @@ -35,6 +35,7 @@ func (graph *Graph) Exists(id string) bool { } func (graph *Graph) Get(id string) (*Image, error) { + // FIXME: return nil when the image doesn't exist, instead of an error img, err := LoadImage(graph.imageRoot(id)) if err != nil { return nil, err diff --git a/runtime.go b/runtime.go index 2c15c35937..9aa213f7e2 100644 --- a/runtime.go +++ b/runtime.go @@ -9,6 +9,7 @@ import ( "os" "path" "sort" + "strings" "sync" "time" ) @@ -62,15 +63,41 @@ func (runtime *Runtime) containerRoot(id string) string { return path.Join(runtime.repository, id) } +func (runtime *Runtime) LookupImage(name string) (*Image, error) { + img, err := runtime.graph.Get(name) + if err != nil { + // FIXME: standardize on returning nil when the image doesn't exist, and err for everything else + // (so we can pass all errors here) + repoAndTag := strings.SplitN(name, ":", 2) + if len(repoAndTag) == 1 { + repoAndTag = append(repoAndTag, "") + } + if i, err := runtime.repositories.GetImage(repoAndTag[0], repoAndTag[1]); err != nil { + return nil, err + } else if i == nil { + return nil, fmt.Errorf("No such image: %s", name) + } else { + img = i + } + } + return img, nil +} + func (runtime *Runtime) Create(command string, args []string, image string, config *Config) (*Container, error) { + // Lookup image + img, err := runtime.LookupImage(image) + if err != nil { + return nil, err + } container := &Container{ // FIXME: we should generate the ID here instead of receiving it as an argument - Id: GenerateId(), - Created: time.Now(), - Path: command, - Args: args, - Config: config, - Image: image, + Id: GenerateId(), + Created: time.Now(), + Path: command, + Args: args, + Config: config, + Image: img.Id, // Always use the resolved image id + //FIXME: store the name under which the image was given, for reference NetworkSettings: &NetworkSettings{}, // FIXME: do we need to store this in the container? SysInitPath: sysInitPath,