dockercmd.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "os/exec"
  6. "strings"
  7. "time"
  8. "github.com/docker/docker/client"
  9. )
  10. func system(commands [][]string) error {
  11. for _, c := range commands {
  12. cmd := exec.Command(c[0], c[1:]...)
  13. cmd.Stdout = os.Stdout
  14. cmd.Stderr = os.Stderr
  15. if err := cmd.Run(); err != nil {
  16. return err
  17. }
  18. }
  19. return nil
  20. }
  21. func pushImage(_ *client.Client, remote, local string) error {
  22. // FIXME: eliminate os/exec (but it is hard to pass auth without os/exec ...)
  23. return system([][]string{
  24. {"docker", "image", "tag", local, remote},
  25. {"docker", "image", "push", remote},
  26. })
  27. }
  28. func deployStack(_ *client.Client, stackName, composeFilePath string) error {
  29. // FIXME: eliminate os/exec (but stack is implemented in CLI ...)
  30. return system([][]string{
  31. {"docker", "stack", "deploy",
  32. "--compose-file", composeFilePath,
  33. "--with-registry-auth",
  34. stackName},
  35. })
  36. }
  37. func hasStack(_ *client.Client, stackName string) bool {
  38. // FIXME: eliminate os/exec (but stack is implemented in CLI ...)
  39. out, err := exec.Command("docker", "stack", "ls").CombinedOutput()
  40. if err != nil {
  41. panic(fmt.Errorf("`docker stack ls` failed with: %s", string(out)))
  42. }
  43. // FIXME: not accurate
  44. return strings.Contains(string(out), stackName)
  45. }
  46. func removeStack(_ *client.Client, stackName string) error {
  47. // FIXME: eliminate os/exec (but stack is implemented in CLI ...)
  48. if err := system([][]string{
  49. {"docker", "stack", "rm", stackName},
  50. }); err != nil {
  51. return err
  52. }
  53. // FIXME
  54. time.Sleep(10 * time.Second)
  55. return nil
  56. }