Docker template generator
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

dotege.go 1.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/docker/docker/client"
  5. "os"
  6. "os/signal"
  7. "syscall"
  8. "time"
  9. )
  10. type Container struct {
  11. Id string
  12. Name string
  13. Labels map[string]string
  14. }
  15. func monitorSignals() <-chan bool {
  16. signals := make(chan os.Signal, 1)
  17. done := make(chan bool, 1)
  18. signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)
  19. go func() {
  20. sig := <-signals
  21. fmt.Printf("Received %s signal\n", sig)
  22. done <- true
  23. }()
  24. return done
  25. }
  26. func main() {
  27. done := monitorSignals()
  28. containerChan := make(chan Container, 1)
  29. expiryChan := make(chan string, 1)
  30. cli, err := client.NewEnvClient()
  31. if err != nil {
  32. panic(err)
  33. }
  34. templateGenerator := NewTemplateGenerator()
  35. templateGenerator.AddTemplate(TemplateConfig{
  36. Source: "./templates/domains.txt.tpl",
  37. })
  38. monitor := NewContainerMonitor(cli, containerChan, expiryChan)
  39. go monitor.Monitor()
  40. go func() {
  41. containers := make(map[string]Container)
  42. timer := time.NewTimer(time.Hour)
  43. timer.Stop()
  44. for {
  45. select {
  46. case container := <-containerChan:
  47. containers[container.Name] = container
  48. timer.Reset(100 * time.Millisecond)
  49. case name := <-expiryChan:
  50. delete(containers, name)
  51. timer.Reset(100 * time.Millisecond)
  52. case <-timer.C:
  53. templateGenerator.Generate(Context{Containers: containers})
  54. }
  55. }
  56. }()
  57. <-done
  58. err = cli.Close()
  59. if err != nil {
  60. panic(err)
  61. }
  62. }