github.com/nguyentm83/docker@v1.5.0/docker/daemon.go (about) 1 // +build daemon 2 3 package main 4 5 import ( 6 "fmt" 7 "io" 8 "os" 9 "path/filepath" 10 11 log "github.com/Sirupsen/logrus" 12 "github.com/docker/docker/builder" 13 "github.com/docker/docker/builtins" 14 "github.com/docker/docker/daemon" 15 _ "github.com/docker/docker/daemon/execdriver/lxc" 16 _ "github.com/docker/docker/daemon/execdriver/native" 17 "github.com/docker/docker/dockerversion" 18 "github.com/docker/docker/engine" 19 flag "github.com/docker/docker/pkg/mflag" 20 "github.com/docker/docker/pkg/signal" 21 "github.com/docker/docker/registry" 22 "github.com/docker/docker/utils" 23 ) 24 25 const CanDaemon = true 26 27 var ( 28 daemonCfg = &daemon.Config{} 29 registryCfg = ®istry.Options{} 30 ) 31 32 func init() { 33 daemonCfg.InstallFlags() 34 registryCfg.InstallFlags() 35 } 36 37 func migrateKey() (err error) { 38 // Migrate trust key if exists at ~/.docker/key.json and owned by current user 39 oldPath := filepath.Join(getHomeDir(), ".docker", defaultTrustKeyFile) 40 newPath := filepath.Join(getDaemonConfDir(), defaultTrustKeyFile) 41 if _, statErr := os.Stat(newPath); os.IsNotExist(statErr) && utils.IsFileOwner(oldPath) { 42 defer func() { 43 // Ensure old path is removed if no error occurred 44 if err == nil { 45 err = os.Remove(oldPath) 46 } else { 47 log.Warnf("Key migration failed, key file not removed at %s", oldPath) 48 } 49 }() 50 51 if err := os.MkdirAll(getDaemonConfDir(), os.FileMode(0644)); err != nil { 52 return fmt.Errorf("Unable to create daemon configuration directory: %s", err) 53 } 54 55 newFile, err := os.OpenFile(newPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600) 56 if err != nil { 57 return fmt.Errorf("error creating key file %q: %s", newPath, err) 58 } 59 defer newFile.Close() 60 61 oldFile, err := os.Open(oldPath) 62 if err != nil { 63 return fmt.Errorf("error opening key file %q: %s", oldPath, err) 64 } 65 defer oldFile.Close() 66 67 if _, err := io.Copy(newFile, oldFile); err != nil { 68 return fmt.Errorf("error copying key: %s", err) 69 } 70 71 log.Infof("Migrated key from %s to %s", oldPath, newPath) 72 } 73 74 return nil 75 } 76 77 func mainDaemon() { 78 if flag.NArg() != 0 { 79 flag.Usage() 80 return 81 } 82 eng := engine.New() 83 signal.Trap(eng.Shutdown) 84 85 if err := migrateKey(); err != nil { 86 log.Fatal(err) 87 } 88 daemonCfg.TrustKeyPath = *flTrustKey 89 90 // Load builtins 91 if err := builtins.Register(eng); err != nil { 92 log.Fatal(err) 93 } 94 95 // load registry service 96 if err := registry.NewService(registryCfg).Install(eng); err != nil { 97 log.Fatal(err) 98 } 99 100 // load the daemon in the background so we can immediately start 101 // the http api so that connections don't fail while the daemon 102 // is booting 103 go func() { 104 d, err := daemon.NewDaemon(daemonCfg, eng) 105 if err != nil { 106 log.Fatal(err) 107 } 108 log.Infof("docker daemon: %s %s; execdriver: %s; graphdriver: %s", 109 dockerversion.VERSION, 110 dockerversion.GITCOMMIT, 111 d.ExecutionDriver().Name(), 112 d.GraphDriver().String(), 113 ) 114 115 if err := d.Install(eng); err != nil { 116 log.Fatal(err) 117 } 118 119 b := &builder.BuilderJob{eng, d} 120 b.Install() 121 122 // after the daemon is done setting up we can tell the api to start 123 // accepting connections 124 if err := eng.Job("acceptconnections").Run(); err != nil { 125 log.Fatal(err) 126 } 127 }() 128 129 // Serve api 130 job := eng.Job("serveapi", flHosts...) 131 job.SetenvBool("Logging", true) 132 job.SetenvBool("EnableCors", *flEnableCors) 133 job.Setenv("Version", dockerversion.VERSION) 134 job.Setenv("SocketGroup", *flSocketGroup) 135 136 job.SetenvBool("Tls", *flTls) 137 job.SetenvBool("TlsVerify", *flTlsVerify) 138 job.Setenv("TlsCa", *flCa) 139 job.Setenv("TlsCert", *flCert) 140 job.Setenv("TlsKey", *flKey) 141 job.SetenvBool("BufferRequests", true) 142 if err := job.Run(); err != nil { 143 log.Fatal(err) 144 } 145 }