diff.go 1.2 KB

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