diff.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package container
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/docker/docker/cli"
  6. "github.com/docker/docker/cli/command"
  7. "github.com/docker/docker/pkg/archive"
  8. "github.com/spf13/cobra"
  9. "golang.org/x/net/context"
  10. )
  11. type diffOptions struct {
  12. container string
  13. }
  14. // NewDiffCommand creates a new cobra.Command for `docker diff`
  15. func NewDiffCommand(dockerCli *command.DockerCli) *cobra.Command {
  16. var opts diffOptions
  17. return &cobra.Command{
  18. Use: "diff CONTAINER",
  19. Short: "Inspect changes to files or directories on a container's filesystem",
  20. Args: cli.ExactArgs(1),
  21. RunE: func(cmd *cobra.Command, args []string) error {
  22. opts.container = args[0]
  23. return runDiff(dockerCli, &opts)
  24. },
  25. }
  26. }
  27. func runDiff(dockerCli *command.DockerCli, opts *diffOptions) error {
  28. if opts.container == "" {
  29. return errors.New("Container name cannot be empty")
  30. }
  31. ctx := context.Background()
  32. changes, err := dockerCli.Client().ContainerDiff(ctx, opts.container)
  33. if err != nil {
  34. return err
  35. }
  36. for _, change := range changes {
  37. var kind string
  38. switch change.Kind {
  39. case archive.ChangeModify:
  40. kind = "C"
  41. case archive.ChangeAdd:
  42. kind = "A"
  43. case archive.ChangeDelete:
  44. kind = "D"
  45. }
  46. fmt.Fprintln(dockerCli.Out(), kind, change.Path)
  47. }
  48. return nil
  49. }