netdata.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package docker
  2. import (
  3. "fmt"
  4. "github.com/docker/docker/api/types/container"
  5. "github.com/docker/go-connections/nat"
  6. "goseg/config"
  7. "os"
  8. "path/filepath"
  9. )
  10. func LoadNetdata() error {
  11. logger.Info("Loading NetData container")
  12. confPath := filepath.Join(config.BasePath, "settings", "netdata.json")
  13. _, err := os.Open(confPath)
  14. if err != nil {
  15. // create a default if it doesn't exist
  16. err = config.CreateDefaultNetdataConf()
  17. if err != nil {
  18. // panic if we can't create it
  19. errmsg := fmt.Sprintf("Unable to create NetData config! %v", err)
  20. logger.Error(errmsg)
  21. panic(errmsg)
  22. }
  23. }
  24. logger.Info("Running NetData")
  25. info, err := StartContainer("netdata", "netdata")
  26. if err != nil {
  27. logger.Error(fmt.Sprintf("Error starting NetData: %v", err))
  28. return err
  29. }
  30. config.UpdateContainerState("netdata", info)
  31. return nil
  32. }
  33. // netdata container config builder
  34. func netdataContainerConf() (container.Config, container.HostConfig, error) {
  35. var containerConfig container.Config
  36. var hostConfig container.HostConfig
  37. // construct the container metadata from version server info
  38. containerInfo, err := GetLatestContainerInfo("netdata")
  39. if err != nil {
  40. return containerConfig, hostConfig, err
  41. }
  42. desiredImage := fmt.Sprintf("%s:%s@sha256:%s", containerInfo["repo"], containerInfo["tag"], containerInfo["hash"])
  43. // construct the container config struct
  44. containerConfig = container.Config{
  45. Image: desiredImage,
  46. ExposedPorts: nat.PortSet{"19999/tcp": struct{}{}},
  47. Volumes: map[string]struct{}{
  48. "/etc/netdata": {},
  49. "/var/lib/netdata": {},
  50. "/var/cache/netdata": {},
  51. "/host/etc/passwd": {},
  52. "/host/etc/group": {},
  53. "/host/proc": {},
  54. "/host/sys": {},
  55. "/host/etc/os-release": {},
  56. },
  57. }
  58. hostConfig = container.HostConfig{
  59. CapAdd: []string{"SYS_PTRACE"},
  60. RestartPolicy: container.RestartPolicy{
  61. Name: "unless-stopped",
  62. },
  63. SecurityOpt: []string{"apparmor=unconfined"},
  64. PortBindings: nat.PortMap{
  65. "19999/tcp": []nat.PortBinding{
  66. {HostIP: "0.0.0.0", HostPort: "19999"},
  67. },
  68. },
  69. Binds: []string{
  70. "netdataconfig:/etc/netdata",
  71. "netdatalib:/var/lib/netdata",
  72. "netdatacache:/var/cache/netdata",
  73. "/etc/passwd:/host/etc/passwd:ro",
  74. "/etc/group:/host/etc/group:ro",
  75. "/proc:/host/proc:ro",
  76. "/sys:/host/sys:ro",
  77. "/etc/os-release:/host/etc/os-release:ro",
  78. },
  79. }
  80. return containerConfig, hostConfig, nil
  81. }