| ... | ... |
@@ -203,13 +203,6 @@ func getImagesJSON(srv *Server, version float64, w http.ResponseWriter, r *http. |
| 203 | 203 |
} |
| 204 | 204 |
} |
| 205 | 205 |
|
| 206 |
-func getImagesViz(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
|
| 207 |
- if err := srv.ImagesViz(w); err != nil {
|
|
| 208 |
- return err |
|
| 209 |
- } |
|
| 210 |
- return nil |
|
| 211 |
-} |
|
| 212 |
- |
|
| 213 | 206 |
func getInfo(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
| 214 | 207 |
return writeJSON(w, http.StatusOK, srv.DockerInfo()) |
| 215 | 208 |
} |
| ... | ... |
@@ -1046,7 +1039,6 @@ func createRouter(srv *Server, logging bool) (*mux.Router, error) {
|
| 1046 | 1046 |
"/info": getInfo, |
| 1047 | 1047 |
"/version": getVersion, |
| 1048 | 1048 |
"/images/json": getImagesJSON, |
| 1049 |
- "/images/viz": getImagesViz, |
|
| 1050 | 1049 |
"/images/search": getImagesSearch, |
| 1051 | 1050 |
"/images/{name:.*}/history": getImagesHistory,
|
| 1052 | 1051 |
"/images/{name:.*}/json": getImagesByName,
|
| ... | ... |
@@ -1067,11 +1067,31 @@ func (cli *DockerCli) CmdImages(args ...string) error {
|
| 1067 | 1067 |
} |
| 1068 | 1068 |
|
| 1069 | 1069 |
if *flViz {
|
| 1070 |
- body, _, err := cli.call("GET", "/images/viz", false)
|
|
| 1070 |
+ body, _, err := cli.call("GET", "/images/json?all=1", nil)
|
|
| 1071 | 1071 |
if err != nil {
|
| 1072 | 1072 |
return err |
| 1073 | 1073 |
} |
| 1074 |
- fmt.Fprintf(cli.out, "%s", body) |
|
| 1074 |
+ |
|
| 1075 |
+ var outs []APIImages |
|
| 1076 |
+ err = json.Unmarshal(body, &outs) |
|
| 1077 |
+ if err != nil {
|
|
| 1078 |
+ return err |
|
| 1079 |
+ } |
|
| 1080 |
+ |
|
| 1081 |
+ fmt.Fprintf(cli.out, "digraph docker {\n")
|
|
| 1082 |
+ |
|
| 1083 |
+ for _, image := range outs {
|
|
| 1084 |
+ if image.ParentId == "" {
|
|
| 1085 |
+ fmt.Fprintf(cli.out, " base -> \"%s\" [style=invis]\n", utils.TruncateID(image.ID)) |
|
| 1086 |
+ } else {
|
|
| 1087 |
+ fmt.Fprintf(cli.out, " \"%s\" -> \"%s\"\n", utils.TruncateID(image.ParentId), utils.TruncateID(image.ID)) |
|
| 1088 |
+ } |
|
| 1089 |
+ if image.RepoTags[0] != "<none>:<none>" {
|
|
| 1090 |
+ fmt.Fprintf(cli.out, " \"%s\" [label=\"%s\\n%s\",shape=box,fillcolor=\"paleturquoise\",style=\"filled,rounded\"];\n", utils.TruncateID(image.ID), utils.TruncateID(image.ID), strings.Join(image.RepoTags, "\\n")) |
|
| 1091 |
+ } |
|
| 1092 |
+ } |
|
| 1093 |
+ |
|
| 1094 |
+ fmt.Fprintf(cli.out, " base [style=invisible]\n}\n") |
|
| 1075 | 1095 |
} else {
|
| 1076 | 1096 |
v := url.Values{}
|
| 1077 | 1097 |
if cmd.NArg() == 1 {
|
| ... | ... |
@@ -233,44 +233,6 @@ func (srv *Server) ImageInsert(name, url, path string, out io.Writer, sf *utils. |
| 233 | 233 |
return img.ShortID(), nil |
| 234 | 234 |
} |
| 235 | 235 |
|
| 236 |
-func (srv *Server) ImagesViz(out io.Writer) error {
|
|
| 237 |
- images, _ := srv.runtime.graph.Map() |
|
| 238 |
- if images == nil {
|
|
| 239 |
- return nil |
|
| 240 |
- } |
|
| 241 |
- out.Write([]byte("digraph docker {\n"))
|
|
| 242 |
- |
|
| 243 |
- var ( |
|
| 244 |
- parentImage *Image |
|
| 245 |
- err error |
|
| 246 |
- ) |
|
| 247 |
- for _, image := range images {
|
|
| 248 |
- parentImage, err = image.GetParent() |
|
| 249 |
- if err != nil {
|
|
| 250 |
- return err |
|
| 251 |
- } |
|
| 252 |
- if parentImage != nil {
|
|
| 253 |
- out.Write([]byte(" \"" + parentImage.ShortID() + "\" -> \"" + image.ShortID() + "\"\n"))
|
|
| 254 |
- } else {
|
|
| 255 |
- out.Write([]byte(" base -> \"" + image.ShortID() + "\" [style=invis]\n"))
|
|
| 256 |
- } |
|
| 257 |
- } |
|
| 258 |
- |
|
| 259 |
- reporefs := make(map[string][]string) |
|
| 260 |
- |
|
| 261 |
- for name, repository := range srv.runtime.repositories.Repositories {
|
|
| 262 |
- for tag, id := range repository {
|
|
| 263 |
- reporefs[utils.TruncateID(id)] = append(reporefs[utils.TruncateID(id)], fmt.Sprintf("%s:%s", name, tag))
|
|
| 264 |
- } |
|
| 265 |
- } |
|
| 266 |
- |
|
| 267 |
- for id, repos := range reporefs {
|
|
| 268 |
- out.Write([]byte(" \"" + id + "\" [label=\"" + id + "\\n" + strings.Join(repos, "\\n") + "\",shape=box,fillcolor=\"paleturquoise\",style=\"filled,rounded\"];\n"))
|
|
| 269 |
- } |
|
| 270 |
- out.Write([]byte(" base [style=invisible]\n}\n"))
|
|
| 271 |
- return nil |
|
| 272 |
-} |
|
| 273 |
- |
|
| 274 | 236 |
func (srv *Server) Images(all bool, filter string) ([]APIImages, error) {
|
| 275 | 237 |
var ( |
| 276 | 238 |
allImages map[string]*Image |
| ... | ... |
@@ -330,6 +292,7 @@ func (srv *Server) Images(all bool, filter string) ([]APIImages, error) {
|
| 330 | 330 |
for _, image := range allImages {
|
| 331 | 331 |
var out APIImages |
| 332 | 332 |
out.ID = image.ID |
| 333 |
+ out.ParentId = image.Parent |
|
| 333 | 334 |
out.RepoTags = []string{"<none>:<none>"}
|
| 334 | 335 |
out.Created = image.Created.Unix() |
| 335 | 336 |
out.Size = image.Size |