github.com/olljanat/moby@v1.13.1/cmd/dockerd/docker.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path/filepath"
     7  	"runtime"
     8  
     9  	"github.com/Sirupsen/logrus"
    10  	"github.com/docker/docker/cli"
    11  	cliflags "github.com/docker/docker/cli/flags"
    12  	"github.com/docker/docker/daemon"
    13  	"github.com/docker/docker/dockerversion"
    14  	"github.com/docker/docker/pkg/reexec"
    15  	"github.com/docker/docker/pkg/term"
    16  	"github.com/spf13/cobra"
    17  	"github.com/spf13/pflag"
    18  )
    19  
    20  type daemonOptions struct {
    21  	version      bool
    22  	configFile   string
    23  	daemonConfig *daemon.Config
    24  	common       *cliflags.CommonOptions
    25  	flags        *pflag.FlagSet
    26  }
    27  
    28  func newDaemonCommand() *cobra.Command {
    29  	opts := daemonOptions{
    30  		daemonConfig: daemon.NewConfig(),
    31  		common:       cliflags.NewCommonOptions(),
    32  	}
    33  
    34  	cmd := &cobra.Command{
    35  		Use:           "dockerd [OPTIONS]",
    36  		Short:         "A self-sufficient runtime for containers.",
    37  		SilenceUsage:  true,
    38  		SilenceErrors: true,
    39  		Args:          cli.NoArgs,
    40  		RunE: func(cmd *cobra.Command, args []string) error {
    41  			opts.flags = cmd.Flags()
    42  			return runDaemon(opts)
    43  		},
    44  	}
    45  	cli.SetupRootCommand(cmd)
    46  
    47  	flags := cmd.Flags()
    48  	flags.BoolVarP(&opts.version, "version", "v", false, "Print version information and quit")
    49  	flags.StringVar(&opts.configFile, flagDaemonConfigFile, defaultDaemonConfigFile, "Daemon configuration file")
    50  	opts.common.InstallFlags(flags)
    51  	opts.daemonConfig.InstallFlags(flags)
    52  	installServiceFlags(flags)
    53  
    54  	return cmd
    55  }
    56  
    57  func runDaemon(opts daemonOptions) error {
    58  	if opts.version {
    59  		showVersion()
    60  		return nil
    61  	}
    62  
    63  	daemonCli := NewDaemonCli()
    64  
    65  	// Windows specific settings as these are not defaulted.
    66  	if runtime.GOOS == "windows" {
    67  		if opts.daemonConfig.Pidfile == "" {
    68  			opts.daemonConfig.Pidfile = filepath.Join(opts.daemonConfig.Root, "docker.pid")
    69  		}
    70  		if opts.configFile == "" {
    71  			opts.configFile = filepath.Join(opts.daemonConfig.Root, `config\daemon.json`)
    72  		}
    73  	}
    74  
    75  	// On Windows, this may be launching as a service or with an option to
    76  	// register the service.
    77  	stop, err := initService(daemonCli)
    78  	if err != nil {
    79  		logrus.Fatal(err)
    80  	}
    81  
    82  	if stop {
    83  		return nil
    84  	}
    85  
    86  	err = daemonCli.start(opts)
    87  	notifyShutdown(err)
    88  	return err
    89  }
    90  
    91  func showVersion() {
    92  	fmt.Printf("Docker version %s, build %s\n", dockerversion.Version, dockerversion.GitCommit)
    93  }
    94  
    95  func main() {
    96  	if reexec.Init() {
    97  		return
    98  	}
    99  
   100  	// Set terminal emulation based on platform as required.
   101  	_, stdout, stderr := term.StdStreams()
   102  	logrus.SetOutput(stderr)
   103  
   104  	cmd := newDaemonCommand()
   105  	cmd.SetOutput(stdout)
   106  	if err := cmd.Execute(); err != nil {
   107  		fmt.Fprintf(stderr, "%s\n", err)
   108  		os.Exit(1)
   109  	}
   110  }