monitor.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package Docker
  2. import (
  3. "AudioPlayer/Common"
  4. "context"
  5. "fmt"
  6. "github.com/docker/docker/api/types/container"
  7. "github.com/docker/docker/client"
  8. "go-micro.dev/v5/registry"
  9. "hash/crc32"
  10. "strings"
  11. "time"
  12. )
  13. type DockerInfo struct {
  14. IdName string
  15. ContainerId string
  16. }
  17. func (o *DockerInfo) Exists(dockerClient *client.Client) bool {
  18. containerInfo, err := dockerClient.ContainerInspect(context.Background(), o.ContainerId)
  19. if err != nil {
  20. return false
  21. }
  22. return containerInfo.State.Running
  23. }
  24. var onlineContainer map[string]DockerInfo
  25. func task() {
  26. cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
  27. if err != nil {
  28. return
  29. }
  30. // 查看正在运行的容器
  31. containers, err := cli.ContainerList(context.Background(), container.ListOptions{})
  32. if err != nil {
  33. return
  34. }
  35. for _, summary := range containers {
  36. var keysToDelete []string
  37. for _, info := range onlineContainer {
  38. if info.Exists(cli) {
  39. continue
  40. }
  41. // 读取文件并解析json
  42. err = Common.Micro.Deregister(&registry.Service{
  43. Name: "omat_business",
  44. Version: "latest",
  45. Nodes: []*registry.Node{
  46. {
  47. Id: info.IdName,
  48. },
  49. },
  50. })
  51. keysToDelete = append(keysToDelete, info.ContainerId)
  52. }
  53. for _, key := range keysToDelete {
  54. delete(onlineContainer, key)
  55. }
  56. if _, ok := onlineContainer[summary.ID]; ok {
  57. continue
  58. }
  59. if strings.Contains(summary.Image, "business-go") {
  60. // 读取文件并解析json
  61. err = Common.Micro.Register(&registry.Service{
  62. Name: "omat_business",
  63. Version: "latest",
  64. Nodes: []*registry.Node{
  65. {
  66. Id: fmt.Sprintf("%s-%v", Common.Machine, crc32.ChecksumIEEE([]byte(summary.Image))),
  67. Address: "0.0.0.0:443",
  68. Metadata: map[string]string{
  69. "protocol": "https",
  70. "ip": strings.Join(Common.Address, ","),
  71. },
  72. },
  73. },
  74. })
  75. if err != nil {
  76. continue
  77. }
  78. onlineContainer[summary.ID] = DockerInfo{
  79. IdName: fmt.Sprintf("%s-%v", Common.Machine, crc32.ChecksumIEEE([]byte(summary.Image))),
  80. ContainerId: summary.ID,
  81. }
  82. }
  83. }
  84. }
  85. func Start() {
  86. onlineContainer = make(map[string]DockerInfo)
  87. for {
  88. task()
  89. time.Sleep(time.Second * 5)
  90. }
  91. }