github.com/ssdev-go/moby@v17.12.1-ce-rc2+incompatible/cmd/dockerd/daemon_unix.go (about) 1 // +build !windows 2 3 package main 4 5 import ( 6 "fmt" 7 "net" 8 "os" 9 "os/signal" 10 "path/filepath" 11 "strconv" 12 13 "github.com/containerd/containerd/linux" 14 "github.com/docker/docker/cmd/dockerd/hack" 15 "github.com/docker/docker/daemon" 16 "github.com/docker/docker/libcontainerd" 17 "github.com/docker/libnetwork/portallocator" 18 "golang.org/x/sys/unix" 19 ) 20 21 const defaultDaemonConfigFile = "/etc/docker/daemon.json" 22 23 // setDefaultUmask sets the umask to 0022 to avoid problems 24 // caused by custom umask 25 func setDefaultUmask() error { 26 desiredUmask := 0022 27 unix.Umask(desiredUmask) 28 if umask := unix.Umask(desiredUmask); umask != desiredUmask { 29 return fmt.Errorf("failed to set umask: expected %#o, got %#o", desiredUmask, umask) 30 } 31 32 return nil 33 } 34 35 func getDaemonConfDir(_ string) string { 36 return "/etc/docker" 37 } 38 39 func (cli *DaemonCli) getPlatformRemoteOptions() ([]libcontainerd.RemoteOption, error) { 40 opts := []libcontainerd.RemoteOption{ 41 libcontainerd.WithOOMScore(cli.Config.OOMScoreAdjust), 42 libcontainerd.WithPlugin("linux", &linux.Config{ 43 Shim: daemon.DefaultShimBinary, 44 Runtime: daemon.DefaultRuntimeBinary, 45 RuntimeRoot: filepath.Join(cli.Config.Root, "runc"), 46 ShimDebug: cli.Config.Debug, 47 }), 48 } 49 if cli.Config.Debug { 50 opts = append(opts, libcontainerd.WithLogLevel("debug")) 51 } 52 if cli.Config.ContainerdAddr != "" { 53 opts = append(opts, libcontainerd.WithRemoteAddr(cli.Config.ContainerdAddr)) 54 } else { 55 opts = append(opts, libcontainerd.WithStartDaemon(true)) 56 } 57 58 return opts, nil 59 } 60 61 // setupConfigReloadTrap configures the USR2 signal to reload the configuration. 62 func (cli *DaemonCli) setupConfigReloadTrap() { 63 c := make(chan os.Signal, 1) 64 signal.Notify(c, unix.SIGHUP) 65 go func() { 66 for range c { 67 cli.reloadConfig() 68 } 69 }() 70 } 71 72 // getSwarmRunRoot gets the root directory for swarm to store runtime state 73 // For example, the control socket 74 func (cli *DaemonCli) getSwarmRunRoot() string { 75 return filepath.Join(cli.Config.ExecRoot, "swarm") 76 } 77 78 // allocateDaemonPort ensures that there are no containers 79 // that try to use any port allocated for the docker server. 80 func allocateDaemonPort(addr string) error { 81 host, port, err := net.SplitHostPort(addr) 82 if err != nil { 83 return err 84 } 85 86 intPort, err := strconv.Atoi(port) 87 if err != nil { 88 return err 89 } 90 91 var hostIPs []net.IP 92 if parsedIP := net.ParseIP(host); parsedIP != nil { 93 hostIPs = append(hostIPs, parsedIP) 94 } else if hostIPs, err = net.LookupIP(host); err != nil { 95 return fmt.Errorf("failed to lookup %s address in host specification", host) 96 } 97 98 pa := portallocator.Get() 99 for _, hostIP := range hostIPs { 100 if _, err := pa.RequestPort(hostIP, "tcp", intPort); err != nil { 101 return fmt.Errorf("failed to allocate daemon listening port %d (err: %v)", intPort, err) 102 } 103 } 104 return nil 105 } 106 107 // notifyShutdown is called after the daemon shuts down but before the process exits. 108 func notifyShutdown(err error) { 109 } 110 111 func wrapListeners(proto string, ls []net.Listener) []net.Listener { 112 switch proto { 113 case "unix": 114 ls[0] = &hack.MalformedHostHeaderOverride{ls[0]} 115 case "fd": 116 for i := range ls { 117 ls[i] = &hack.MalformedHostHeaderOverride{ls[i]} 118 } 119 } 120 return ls 121 }