init.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // DEPRECATION NOTICE. PLEASE DO NOT ADD ANYTHING TO THIS FILE.
  2. //
  3. // For additional commments see server/server.go
  4. //
  5. package server
  6. import (
  7. "fmt"
  8. "github.com/docker/docker/daemon"
  9. "github.com/docker/docker/daemonconfig"
  10. "github.com/docker/docker/engine"
  11. "github.com/docker/docker/pkg/signal"
  12. "github.com/docker/docker/utils"
  13. )
  14. func (srv *Server) handlerWrap(h engine.Handler) engine.Handler {
  15. return func(job *engine.Job) engine.Status {
  16. if !srv.IsRunning() {
  17. return job.Errorf("Server is not running")
  18. }
  19. srv.tasks.Add(1)
  20. defer srv.tasks.Done()
  21. return h(job)
  22. }
  23. }
  24. func InitPidfile(job *engine.Job) engine.Status {
  25. if len(job.Args) == 0 {
  26. return job.Error(fmt.Errorf("no pidfile provided to initialize"))
  27. }
  28. job.Logf("Creating pidfile")
  29. if err := utils.CreatePidFile(job.Args[0]); err != nil {
  30. return job.Error(err)
  31. }
  32. return engine.StatusOK
  33. }
  34. // jobInitApi runs the remote api server `srv` as a daemon,
  35. // Only one api server can run at the same time - this is enforced by a pidfile.
  36. // The signals SIGINT, SIGQUIT and SIGTERM are intercepted for cleanup.
  37. func InitServer(job *engine.Job) engine.Status {
  38. job.Logf("Creating server")
  39. srv, err := NewServer(job.Eng, daemonconfig.ConfigFromJob(job))
  40. if err != nil {
  41. return job.Error(err)
  42. }
  43. job.Logf("Setting up signal traps")
  44. signal.Trap(func() {
  45. utils.RemovePidFile(srv.daemon.Config().Pidfile)
  46. srv.Close()
  47. })
  48. job.Eng.Hack_SetGlobalVar("httpapi.server", srv)
  49. job.Eng.Hack_SetGlobalVar("httpapi.daemon", srv.daemon)
  50. for name, handler := range map[string]engine.Handler{
  51. "build": srv.Build,
  52. "pull": srv.ImagePull,
  53. "push": srv.ImagePush,
  54. } {
  55. if err := job.Eng.Register(name, srv.handlerWrap(handler)); err != nil {
  56. return job.Error(err)
  57. }
  58. }
  59. // Install image-related commands from the image subsystem.
  60. // See `graph/service.go`
  61. if err := srv.daemon.Repositories().Install(job.Eng); err != nil {
  62. return job.Error(err)
  63. }
  64. // Install daemon-related commands from the daemon subsystem.
  65. // See `daemon/`
  66. if err := srv.daemon.Install(job.Eng); err != nil {
  67. return job.Error(err)
  68. }
  69. srv.SetRunning(true)
  70. return engine.StatusOK
  71. }
  72. func NewServer(eng *engine.Engine, config *daemonconfig.Config) (*Server, error) {
  73. daemon, err := daemon.NewDaemon(config, eng)
  74. if err != nil {
  75. return nil, err
  76. }
  77. srv := &Server{
  78. Eng: eng,
  79. daemon: daemon,
  80. pullingPool: make(map[string]chan struct{}),
  81. pushingPool: make(map[string]chan struct{}),
  82. }
  83. daemon.SetServer(srv)
  84. return srv, nil
  85. }