server_linux.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // +build linux
  2. package server
  3. import (
  4. "fmt"
  5. "net"
  6. "net/http"
  7. "github.com/docker/docker/daemon"
  8. "github.com/docker/docker/pkg/sockets"
  9. "github.com/docker/docker/pkg/systemd"
  10. )
  11. // newServer sets up the required serverClosers and does protocol specific checking.
  12. func (s *Server) newServer(proto, addr string) ([]serverCloser, error) {
  13. var (
  14. err error
  15. ls []net.Listener
  16. )
  17. switch proto {
  18. case "fd":
  19. ls, err = systemd.ListenFD(addr)
  20. if err != nil {
  21. return nil, err
  22. }
  23. // We don't want to start serving on these sockets until the
  24. // daemon is initialized and installed. Otherwise required handlers
  25. // won't be ready.
  26. <-s.start
  27. case "tcp":
  28. l, err := s.initTcpSocket(addr)
  29. if err != nil {
  30. return nil, err
  31. }
  32. ls = append(ls, l)
  33. case "unix":
  34. l, err := sockets.NewUnixSocket(addr, s.cfg.SocketGroup, s.start)
  35. if err != nil {
  36. return nil, err
  37. }
  38. ls = append(ls, l)
  39. default:
  40. return nil, fmt.Errorf("Invalid protocol format: %q", proto)
  41. }
  42. var res []serverCloser
  43. for _, l := range ls {
  44. res = append(res, &HttpServer{
  45. &http.Server{
  46. Addr: addr,
  47. Handler: s.router,
  48. },
  49. l,
  50. })
  51. }
  52. return res, nil
  53. }
  54. func (s *Server) AcceptConnections(d *daemon.Daemon) {
  55. // Tell the init daemon we are accepting requests
  56. s.daemon = d
  57. go systemd.SdNotify("READY=1")
  58. // close the lock so the listeners start accepting connections
  59. select {
  60. case <-s.start:
  61. default:
  62. close(s.start)
  63. }
  64. }