inspect.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package client
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io"
  7. "strings"
  8. "text/template"
  9. flag "github.com/docker/docker/pkg/mflag"
  10. "github.com/docker/docker/utils"
  11. )
  12. // CmdInspect displays low-level information on one or more containers or images.
  13. //
  14. // Usage: docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE...]
  15. func (cli *DockerCli) CmdInspect(args ...string) error {
  16. cmd := cli.Subcmd("inspect", "CONTAINER|IMAGE [CONTAINER|IMAGE...]", "Return low-level information on a container or image", true)
  17. tmplStr := cmd.String([]string{"f", "#format", "-format"}, "", "Format the output using the given go template")
  18. cmd.Require(flag.Min, 1)
  19. utils.ParseFlags(cmd, args, true)
  20. var tmpl *template.Template
  21. if *tmplStr != "" {
  22. var err error
  23. if tmpl, err = template.New("").Funcs(funcMap).Parse(*tmplStr); err != nil {
  24. fmt.Fprintf(cli.err, "Template parsing error: %v\n", err)
  25. return &utils.StatusError{StatusCode: 64,
  26. Status: "Template parsing error: " + err.Error()}
  27. }
  28. }
  29. indented := new(bytes.Buffer)
  30. indented.WriteByte('[')
  31. status := 0
  32. for _, name := range cmd.Args() {
  33. obj, _, err := readBody(cli.call("GET", "/containers/"+name+"/json", nil, false))
  34. if err != nil {
  35. if strings.Contains(err.Error(), "Too many") {
  36. fmt.Fprintf(cli.err, "Error: %v", err)
  37. status = 1
  38. continue
  39. }
  40. obj, _, err = readBody(cli.call("GET", "/images/"+name+"/json", nil, false))
  41. if err != nil {
  42. if strings.Contains(err.Error(), "No such") {
  43. fmt.Fprintf(cli.err, "Error: No such image or container: %s\n", name)
  44. } else {
  45. fmt.Fprintf(cli.err, "%s", err)
  46. }
  47. status = 1
  48. continue
  49. }
  50. }
  51. if tmpl == nil {
  52. if err = json.Indent(indented, obj, "", " "); err != nil {
  53. fmt.Fprintf(cli.err, "%s\n", err)
  54. status = 1
  55. continue
  56. }
  57. } else {
  58. // Has template, will render
  59. var value interface{}
  60. if err := json.Unmarshal(obj, &value); err != nil {
  61. fmt.Fprintf(cli.err, "%s\n", err)
  62. status = 1
  63. continue
  64. }
  65. if err := tmpl.Execute(cli.out, value); err != nil {
  66. return err
  67. }
  68. cli.out.Write([]byte{'\n'})
  69. }
  70. indented.WriteString(",")
  71. }
  72. if indented.Len() > 1 {
  73. // Remove trailing ','
  74. indented.Truncate(indented.Len() - 1)
  75. }
  76. indented.WriteString("]\n")
  77. if tmpl == nil {
  78. if _, err := io.Copy(cli.out, indented); err != nil {
  79. return err
  80. }
  81. }
  82. if status != 0 {
  83. return &utils.StatusError{StatusCode: status}
  84. }
  85. return nil
  86. }