inspect.go 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package client
  2. import (
  3. "fmt"
  4. "golang.org/x/net/context"
  5. "github.com/docker/docker/api/client/inspect"
  6. Cli "github.com/docker/docker/cli"
  7. flag "github.com/docker/docker/pkg/mflag"
  8. "github.com/docker/engine-api/client"
  9. )
  10. // CmdInspect displays low-level information on one or more containers, images or tasks.
  11. //
  12. // Usage: docker inspect [OPTIONS] CONTAINER|IMAGE|TASK [CONTAINER|IMAGE|TASK...]
  13. func (cli *DockerCli) CmdInspect(args ...string) error {
  14. cmd := Cli.Subcmd("inspect", []string{"[OPTIONS] CONTAINER|IMAGE|TASK [CONTAINER|IMAGE|TASK...]"}, Cli.DockerCommands["inspect"].Description, true)
  15. tmplStr := cmd.String([]string{"f", "-format"}, "", "Format the output using the given go template")
  16. inspectType := cmd.String([]string{"-type"}, "", "Return JSON for specified type, (e.g image, container or task)")
  17. size := cmd.Bool([]string{"s", "-size"}, false, "Display total file sizes if the type is container")
  18. cmd.Require(flag.Min, 1)
  19. cmd.ParseFlags(args, true)
  20. if *inspectType != "" && *inspectType != "container" && *inspectType != "image" && *inspectType != "task" {
  21. return fmt.Errorf("%q is not a valid value for --type", *inspectType)
  22. }
  23. ctx := context.Background()
  24. var elementSearcher inspect.GetRefFunc
  25. switch *inspectType {
  26. case "container":
  27. elementSearcher = cli.inspectContainers(ctx, *size)
  28. case "image":
  29. elementSearcher = cli.inspectImages(ctx, *size)
  30. case "task":
  31. if *size {
  32. fmt.Fprintln(cli.err, "WARNING: --size ignored for tasks")
  33. }
  34. elementSearcher = cli.inspectTasks(ctx)
  35. default:
  36. elementSearcher = cli.inspectAll(ctx, *size)
  37. }
  38. return inspect.Inspect(cli.out, cmd.Args(), *tmplStr, elementSearcher)
  39. }
  40. func (cli *DockerCli) inspectContainers(ctx context.Context, getSize bool) inspect.GetRefFunc {
  41. return func(ref string) (interface{}, []byte, error) {
  42. return cli.client.ContainerInspectWithRaw(ctx, ref, getSize)
  43. }
  44. }
  45. func (cli *DockerCli) inspectImages(ctx context.Context, getSize bool) inspect.GetRefFunc {
  46. return func(ref string) (interface{}, []byte, error) {
  47. return cli.client.ImageInspectWithRaw(ctx, ref, getSize)
  48. }
  49. }
  50. func (cli *DockerCli) inspectTasks(ctx context.Context) inspect.GetRefFunc {
  51. return func(ref string) (interface{}, []byte, error) {
  52. return cli.client.TaskInspectWithRaw(ctx, ref)
  53. }
  54. }
  55. func (cli *DockerCli) inspectAll(ctx context.Context, getSize bool) inspect.GetRefFunc {
  56. return func(ref string) (interface{}, []byte, error) {
  57. c, rawContainer, err := cli.client.ContainerInspectWithRaw(ctx, ref, getSize)
  58. if err != nil {
  59. // Search for image with that id if a container doesn't exist.
  60. if client.IsErrContainerNotFound(err) {
  61. i, rawImage, err := cli.client.ImageInspectWithRaw(ctx, ref, getSize)
  62. if err != nil {
  63. if client.IsErrImageNotFound(err) {
  64. // Search for task with that id if an image doesn't exists.
  65. t, rawTask, err := cli.client.TaskInspectWithRaw(ctx, ref)
  66. if err != nil {
  67. return nil, nil, fmt.Errorf("Error: No such image, container or task: %s", ref)
  68. }
  69. if getSize {
  70. fmt.Fprintln(cli.err, "WARNING: --size ignored for tasks")
  71. }
  72. return t, rawTask, nil
  73. }
  74. return nil, nil, err
  75. }
  76. return i, rawImage, nil
  77. }
  78. return nil, nil, err
  79. }
  80. return c, rawContainer, nil
  81. }
  82. }