diff --git a/cmd/dockerd/docker.go b/cmd/dockerd/docker.go index 6d1674f147230..0bde86d203547 100644 --- a/cmd/dockerd/docker.go +++ b/cmd/dockerd/docker.go @@ -74,7 +74,7 @@ func runDaemon(opts daemonOptions) error { // On Windows, this may be launching as a service or with an option to // register the service. - stop, err := initService(daemonCli) + stop, runAsService, err := initService(daemonCli) if err != nil { logrus.Fatal(err) } @@ -83,6 +83,11 @@ func runDaemon(opts daemonOptions) error { return nil } + // If Windows SCM manages the service - no need for PID files + if runAsService { + opts.daemonConfig.Pidfile = "" + } + err = daemonCli.start(opts) notifyShutdown(err) return err diff --git a/cmd/dockerd/service_unsupported.go b/cmd/dockerd/service_unsupported.go index 64ad7fcaa08df..e67ad474b185d 100644 --- a/cmd/dockerd/service_unsupported.go +++ b/cmd/dockerd/service_unsupported.go @@ -6,8 +6,8 @@ import ( "github.com/spf13/pflag" ) -func initService(daemonCli *DaemonCli) (bool, error) { - return false, nil +func initService(daemonCli *DaemonCli) (bool, bool, error) { + return false, false, nil } func installServiceFlags(flags *pflag.FlagSet) { diff --git a/cmd/dockerd/service_windows.go b/cmd/dockerd/service_windows.go index 10171b0e3ee3b..3d038fad79911 100644 --- a/cmd/dockerd/service_windows.go +++ b/cmd/dockerd/service_windows.go @@ -254,25 +254,28 @@ func unregisterService() error { return nil } -func initService(daemonCli *DaemonCli) (bool, error) { +// initService is the entry point for running the daemon as a Windows +// service. It returns an indication to stop (if registering/un-registering); +// an indication of whether it is running as a service; and an error. +func initService(daemonCli *DaemonCli) (bool, bool, error) { if *flUnregisterService { if *flRegisterService { - return true, errors.New("--register-service and --unregister-service cannot be used together") + return true, false, errors.New("--register-service and --unregister-service cannot be used together") } - return true, unregisterService() + return true, false, unregisterService() } if *flRegisterService { - return true, registerService() + return true, false, registerService() } if !*flRunService { - return false, nil + return false, false, nil } interactive, err := svc.IsAnInteractiveSession() if err != nil { - return false, err + return false, false, err } h := &handler{ @@ -285,7 +288,7 @@ func initService(daemonCli *DaemonCli) (bool, error) { if !interactive { log, err = eventlog.Open(*flServiceName) if err != nil { - return false, err + return false, false, err } } @@ -306,9 +309,9 @@ func initService(daemonCli *DaemonCli) (bool, error) { // Wait for the first signal from the service handler. err = <-h.fromsvc if err != nil { - return false, err + return false, false, err } - return false, nil + return false, true, nil } func (h *handler) started() error {