test.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package Docker
  2. import (
  3. "context"
  4. "github.com/docker/docker/api/types/container"
  5. "github.com/docker/docker/client"
  6. "regexp"
  7. "sync"
  8. "time"
  9. )
  10. var OnlineContainerID map[string]container.Summary
  11. var OnlineContainerMux sync.RWMutex
  12. var isMonitoring bool
  13. var monitorTimer *time.Timer
  14. var debounceDuration = 5 * time.Second // 设置消抖时间为5秒
  15. func DockerOnlineContainer() {
  16. if isMonitoring {
  17. return
  18. }
  19. isMonitoring = true
  20. ctx := context.Background()
  21. cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
  22. if err != nil {
  23. return
  24. }
  25. // 查看正在运行的容器
  26. containers, err := cli.ContainerList(ctx, container.ListOptions{})
  27. if err != nil {
  28. return
  29. }
  30. OnlineContainerMux.Lock()
  31. OnlineContainerID = make(map[string]container.Summary)
  32. compile, err := regexp.Compile("business-go")
  33. if err != nil {
  34. return
  35. }
  36. for _, info := range containers {
  37. if !compile.MatchString(info.Image) {
  38. continue
  39. }
  40. OnlineContainerID[info.ID] = info
  41. }
  42. OnlineContainerMux.Unlock()
  43. if monitorTimer != nil {
  44. monitorTimer.Stop()
  45. }
  46. monitorTimer = time.AfterFunc(debounceDuration, func() {
  47. isMonitoring = false
  48. })
  49. return
  50. }