inspect.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package client
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "text/template"
  6. "github.com/docker/docker/api/client/inspect"
  7. "github.com/docker/docker/api/client/lib"
  8. Cli "github.com/docker/docker/cli"
  9. flag "github.com/docker/docker/pkg/mflag"
  10. )
  11. var funcMap = template.FuncMap{
  12. "json": func(v interface{}) string {
  13. a, _ := json.Marshal(v)
  14. return string(a)
  15. },
  16. }
  17. // CmdInspect displays low-level information on one or more containers or images.
  18. //
  19. // Usage: docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE...]
  20. func (cli *DockerCli) CmdInspect(args ...string) error {
  21. cmd := Cli.Subcmd("inspect", []string{"CONTAINER|IMAGE [CONTAINER|IMAGE...]"}, Cli.DockerCommands["inspect"].Description, true)
  22. tmplStr := cmd.String([]string{"f", "-format"}, "", "Format the output using the given go template")
  23. inspectType := cmd.String([]string{"-type"}, "", "Return JSON for specified type, (e.g image or container)")
  24. size := cmd.Bool([]string{"s", "-size"}, false, "Display total file sizes if the type is container")
  25. cmd.Require(flag.Min, 1)
  26. cmd.ParseFlags(args, true)
  27. if *inspectType != "" && *inspectType != "container" && *inspectType != "image" {
  28. return fmt.Errorf("%q is not a valid value for --type", *inspectType)
  29. }
  30. var (
  31. err error
  32. tmpl *template.Template
  33. elementInspector inspect.Inspector
  34. )
  35. if *tmplStr != "" {
  36. if tmpl, err = template.New("").Funcs(funcMap).Parse(*tmplStr); err != nil {
  37. return Cli.StatusError{StatusCode: 64,
  38. Status: "Template parsing error: " + err.Error()}
  39. }
  40. }
  41. if tmpl != nil {
  42. elementInspector = inspect.NewTemplateInspector(cli.out, tmpl)
  43. } else {
  44. elementInspector = inspect.NewIndentedInspector(cli.out)
  45. }
  46. switch *inspectType {
  47. case "container":
  48. err = cli.inspectContainers(cmd.Args(), *size, elementInspector)
  49. case "images":
  50. err = cli.inspectImages(cmd.Args(), *size, elementInspector)
  51. default:
  52. err = cli.inspectAll(cmd.Args(), *size, elementInspector)
  53. }
  54. if err := elementInspector.Flush(); err != nil {
  55. return err
  56. }
  57. return err
  58. }
  59. func (cli *DockerCli) inspectContainers(containerIDs []string, getSize bool, elementInspector inspect.Inspector) error {
  60. for _, containerID := range containerIDs {
  61. if err := cli.inspectContainer(containerID, getSize, elementInspector); err != nil {
  62. if lib.IsErrContainerNotFound(err) {
  63. return fmt.Errorf("Error: No such container: %s\n", containerID)
  64. }
  65. return err
  66. }
  67. }
  68. return nil
  69. }
  70. func (cli *DockerCli) inspectImages(imageIDs []string, getSize bool, elementInspector inspect.Inspector) error {
  71. for _, imageID := range imageIDs {
  72. if err := cli.inspectImage(imageID, getSize, elementInspector); err != nil {
  73. if lib.IsErrImageNotFound(err) {
  74. return fmt.Errorf("Error: No such image: %s\n", imageID)
  75. }
  76. return err
  77. }
  78. }
  79. return nil
  80. }
  81. func (cli *DockerCli) inspectAll(ids []string, getSize bool, elementInspector inspect.Inspector) error {
  82. for _, id := range ids {
  83. if err := cli.inspectContainer(id, getSize, elementInspector); err != nil {
  84. // Search for image with that id if a container doesn't exist.
  85. if lib.IsErrContainerNotFound(err) {
  86. if err := cli.inspectImage(id, getSize, elementInspector); err != nil {
  87. if lib.IsErrImageNotFound(err) {
  88. return fmt.Errorf("Error: No such image or container: %s", id)
  89. }
  90. return err
  91. }
  92. continue
  93. }
  94. return err
  95. }
  96. }
  97. return nil
  98. }
  99. func (cli *DockerCli) inspectContainer(containerID string, getSize bool, elementInspector inspect.Inspector) error {
  100. c, raw, err := cli.client.ContainerInspectWithRaw(containerID, getSize)
  101. if err != nil {
  102. return err
  103. }
  104. return elementInspector.Inspect(c, raw)
  105. }
  106. func (cli *DockerCli) inspectImage(imageID string, getSize bool, elementInspector inspect.Inspector) error {
  107. i, raw, err := cli.client.ImageInspectWithRaw(imageID, getSize)
  108. if err != nil {
  109. return err
  110. }
  111. return elementInspector.Inspect(i, raw)
  112. }