diff --git a/components/engine/api_params.go b/components/engine/api_params.go index 2a641f8ccd..c3fabb2be0 100644 --- a/components/engine/api_params.go +++ b/components/engine/api_params.go @@ -2,6 +2,7 @@ package docker type APIHistory struct { ID string `json:"Id"` + Tag string `json:",omitempty"` Created int64 CreatedBy string `json:",omitempty"` } diff --git a/components/engine/commands.go b/components/engine/commands.go index ce15fd6cf1..98be40181c 100644 --- a/components/engine/commands.go +++ b/components/engine/commands.go @@ -627,7 +627,7 @@ func (cli *DockerCli) CmdHistory(args ...string) error { fmt.Fprintln(w, "ID\tCREATED\tCREATED BY") for _, out := range outs { - fmt.Fprintf(w, "%s\t%s ago\t%s\n", out.ID, utils.HumanDuration(time.Now().Sub(time.Unix(out.Created, 0))), out.CreatedBy) + fmt.Fprintf(w, "%s (%s)\t%s ago\t%s\n", out.ID, out.Tag, utils.HumanDuration(time.Now().Sub(time.Unix(out.Created, 0))), out.CreatedBy) } w.Flush() return nil diff --git a/components/engine/server.go b/components/engine/server.go index 30e3ec6b3a..912349b82e 100644 --- a/components/engine/server.go +++ b/components/engine/server.go @@ -218,12 +218,26 @@ func (srv *Server) ImageHistory(name string) ([]APIHistory, error) { return nil, err } + lookupMap := make(map[string]string) + for name, repository := range srv.runtime.repositories.Repositories { + for tag, id := range repository { + // If the ID already has a reverse lookup, do not update it unless for "latest" + if _, exists := lookupMap[id]; exists { + if tag != "latest" { + continue + } + } + lookupMap[id] = name + ":" + tag + } + } + outs := []APIHistory{} //produce [] when empty instead of 'null' err = image.WalkHistory(func(img *Image) error { var out APIHistory out.ID = srv.runtime.repositories.ImageName(img.ShortID()) out.Created = img.Created.Unix() out.CreatedBy = strings.Join(img.ContainerConfig.Cmd, " ") + out.Tag = lookupMap[img.ID] outs = append(outs, out) return nil })