github.com/daaku/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 = &registry.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  }