docker.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. }
  65. func GetContainerStats(containerName string) (*ContainerStats, error) {
  66. cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
  67. if err != nil {
  68. return nil, err
  69. }
  70. defer cli.Close()
  71. stats, err := cli.ContainerStats(context.Background(), containerName, false)
  72. if err != nil {
  73. return nil, err
  74. }
  75. defer stats.Body.Close()
  76. var stat types.StatsJSON
  77. if err := stats.Decode(&stat); err != nil {
  78. return nil, err
  79. }
  80. memUsage := stat.MemoryStats.Usage
  81. var diskUsage uint64
  82. for _, mount := range stat.Mounts {
  83. if mount.Name == "container_root" {
  84. diskUsage = mount.SizeRw
  85. break
  86. }
  87. }
  88. return &ContainerStats{
  89. MemoryUsage: memUsage,
  90. DiskUsage: diskUsage,
  91. }, nil
  92. }