dockerd.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package containers
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/coroot/coroot-node-agent/proc"
  6. "github.com/coroot/logparser"
  7. "github.com/docker/docker/client"
  8. "inet.af/netaddr"
  9. "strings"
  10. "time"
  11. )
  12. const dockerdTimeout = 30 * time.Second
  13. var (
  14. dockerdClient *client.Client
  15. )
  16. func DockerdInit() error {
  17. c, err := client.NewClientWithOpts(
  18. client.WithHost("unix://"+proc.HostPath("/run/docker.sock")),
  19. client.WithVersion("1.12"),
  20. )
  21. if err != nil {
  22. return err
  23. }
  24. ctx, cancelFn := context.WithTimeout(context.Background(), dockerdTimeout)
  25. defer cancelFn()
  26. c.NegotiateAPIVersion(ctx)
  27. dockerdClient = c
  28. return nil
  29. }
  30. func DockerdInspect(containerID string) (*ContainerMetadata, error) {
  31. if dockerdClient == nil {
  32. return nil, fmt.Errorf("dockerd client not initialized")
  33. }
  34. ctx, cancel := context.WithTimeout(context.Background(), dockerdTimeout)
  35. defer cancel()
  36. c, err := dockerdClient.ContainerInspect(ctx, containerID)
  37. if err != nil {
  38. return nil, err
  39. }
  40. res := &ContainerMetadata{
  41. name: strings.TrimPrefix(c.Name, "/"),
  42. labels: c.Config.Labels,
  43. volumes: map[string]Volume{},
  44. hostListens: map[string][]netaddr.IPPort{},
  45. }
  46. for _, m := range c.Mounts {
  47. if provisioner, volume := parseVolumeSource(m.Source); provisioner != "" && volume != "" {
  48. res.volumes[m.Destination] = Volume{provisioner: provisioner, volume: volume}
  49. }
  50. }
  51. if c.LogPath != "" && c.HostConfig.LogConfig.Type == "json-file" {
  52. res.logPath = c.LogPath
  53. res.logDecoder = logparser.DockerJsonDecoder{}
  54. }
  55. if c.NetworkSettings != nil {
  56. addrs := map[netaddr.IPPort]struct{}{}
  57. for port, bindings := range c.NetworkSettings.Ports {
  58. if port.Proto() != "tcp" {
  59. continue
  60. }
  61. for _, b := range bindings {
  62. if ipp, err := netaddr.ParseIPPort(b.HostIP + ":" + b.HostPort); err == nil {
  63. addrs[ipp] = struct{}{}
  64. }
  65. }
  66. }
  67. if len(addrs) > 0 {
  68. s := make([]netaddr.IPPort, 0, len(addrs))
  69. for addr := range addrs {
  70. s = append(s, addr)
  71. }
  72. res.hostListens["dockerd"] = s
  73. }
  74. }
  75. return res, nil
  76. }