docker.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package docker
  2. import (
  3. "context"
  4. "fmt"
  5. "log/slog"
  6. "os"
  7. "github.com/docker/docker/api/types"
  8. "github.com/docker/docker/client"
  9. )
  10. var (
  11. logger = slog.New(slog.NewJSONHandler(os.Stdout, nil))
  12. )
  13. func GetShipStatus(patps []string) (map[string]string, error) {
  14. statuses := make(map[string]string)
  15. cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
  16. if err != nil {
  17. errmsg := fmt.Sprintf("Error getting Docker info: %v", err)
  18. logger.Error(errmsg)
  19. return statuses, err
  20. } else {
  21. containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
  22. if err != nil {
  23. errmsg := fmt.Sprintf("Error getting containers: %v", err)
  24. logger.Error(errmsg)
  25. return statuses, err
  26. } else {
  27. for _, pier := range patps {
  28. found := false
  29. for _, container := range containers {
  30. for _, name := range container.Names {
  31. fasPier := "/" + pier
  32. if name == fasPier {
  33. statuses[pier] = container.Status
  34. found = true
  35. break
  36. }
  37. }
  38. if found {
  39. break
  40. }
  41. }
  42. if !found {
  43. statuses[pier] = "not found"
  44. }
  45. }
  46. }
  47. return statuses, nil
  48. }
  49. }
  50. func GetContainerNetwork(name string) (string, error) {
  51. cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
  52. if err != nil {
  53. return "", err
  54. }
  55. defer cli.Close()
  56. containerJSON, err := cli.ContainerInspect(context.Background(), name)
  57. if err != nil {
  58. return "", err
  59. }
  60. for networkName := range containerJSON.NetworkSettings.Networks {
  61. return networkName, nil
  62. }
  63. return "", fmt.Errorf("container is not attached to any network")
  64. }