github.com/olljanat/moby@v1.13.1/cli/command/swarm/init.go (about)

     1  package swarm
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"golang.org/x/net/context"
     8  
     9  	"github.com/docker/docker/api/types/swarm"
    10  	"github.com/docker/docker/cli"
    11  	"github.com/docker/docker/cli/command"
    12  	"github.com/pkg/errors"
    13  	"github.com/spf13/cobra"
    14  	"github.com/spf13/pflag"
    15  )
    16  
    17  type initOptions struct {
    18  	swarmOptions
    19  	listenAddr NodeAddrOption
    20  	// Not a NodeAddrOption because it has no default port.
    21  	advertiseAddr   string
    22  	forceNewCluster bool
    23  }
    24  
    25  func newInitCommand(dockerCli *command.DockerCli) *cobra.Command {
    26  	opts := initOptions{
    27  		listenAddr: NewListenAddrOption(),
    28  	}
    29  
    30  	cmd := &cobra.Command{
    31  		Use:   "init [OPTIONS]",
    32  		Short: "Initialize a swarm",
    33  		Args:  cli.NoArgs,
    34  		RunE: func(cmd *cobra.Command, args []string) error {
    35  			return runInit(dockerCli, cmd.Flags(), opts)
    36  		},
    37  	}
    38  
    39  	flags := cmd.Flags()
    40  	flags.Var(&opts.listenAddr, flagListenAddr, "Listen address (format: <ip|interface>[:port])")
    41  	flags.StringVar(&opts.advertiseAddr, flagAdvertiseAddr, "", "Advertised address (format: <ip|interface>[:port])")
    42  	flags.BoolVar(&opts.forceNewCluster, "force-new-cluster", false, "Force create a new cluster from current state")
    43  	flags.BoolVar(&opts.autolock, flagAutolock, false, "Enable manager autolocking (requiring an unlock key to start a stopped manager)")
    44  	addSwarmFlags(flags, &opts.swarmOptions)
    45  	return cmd
    46  }
    47  
    48  func runInit(dockerCli *command.DockerCli, flags *pflag.FlagSet, opts initOptions) error {
    49  	client := dockerCli.Client()
    50  	ctx := context.Background()
    51  
    52  	req := swarm.InitRequest{
    53  		ListenAddr:       opts.listenAddr.String(),
    54  		AdvertiseAddr:    opts.advertiseAddr,
    55  		ForceNewCluster:  opts.forceNewCluster,
    56  		Spec:             opts.swarmOptions.ToSpec(flags),
    57  		AutoLockManagers: opts.swarmOptions.autolock,
    58  	}
    59  
    60  	nodeID, err := client.SwarmInit(ctx, req)
    61  	if err != nil {
    62  		if strings.Contains(err.Error(), "could not choose an IP address to advertise") || strings.Contains(err.Error(), "could not find the system's IP address") {
    63  			return errors.New(err.Error() + " - specify one with --advertise-addr")
    64  		}
    65  		return err
    66  	}
    67  
    68  	fmt.Fprintf(dockerCli.Out(), "Swarm initialized: current node (%s) is now a manager.\n\n", nodeID)
    69  
    70  	if err := printJoinCommand(ctx, dockerCli, nodeID, true, false); err != nil {
    71  		return err
    72  	}
    73  
    74  	fmt.Fprint(dockerCli.Out(), "To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.\n\n")
    75  
    76  	if req.AutoLockManagers {
    77  		unlockKeyResp, err := client.SwarmGetUnlockKey(ctx)
    78  		if err != nil {
    79  			return errors.Wrap(err, "could not fetch unlock key")
    80  		}
    81  		printUnlockCommand(ctx, dockerCli, unlockKeyResp.UnlockKey)
    82  	}
    83  
    84  	return nil
    85  }