github.1git.de/docker/cli@v26.1.3+incompatible/cli/command/secret/create.go (about) 1 package secret 2 3 import ( 4 "context" 5 "fmt" 6 "io" 7 8 "github.com/docker/cli/cli" 9 "github.com/docker/cli/cli/command" 10 "github.com/docker/cli/opts" 11 "github.com/docker/docker/api/types/swarm" 12 "github.com/moby/sys/sequential" 13 "github.com/pkg/errors" 14 "github.com/spf13/cobra" 15 ) 16 17 type createOptions struct { 18 name string 19 driver string 20 templateDriver string 21 file string 22 labels opts.ListOpts 23 } 24 25 func newSecretCreateCommand(dockerCli command.Cli) *cobra.Command { 26 options := createOptions{ 27 labels: opts.NewListOpts(opts.ValidateLabel), 28 } 29 30 cmd := &cobra.Command{ 31 Use: "create [OPTIONS] SECRET [file|-]", 32 Short: "Create a secret from a file or STDIN as content", 33 Args: cli.RequiresRangeArgs(1, 2), 34 RunE: func(cmd *cobra.Command, args []string) error { 35 options.name = args[0] 36 if len(args) == 2 { 37 options.file = args[1] 38 } 39 return runSecretCreate(cmd.Context(), dockerCli, options) 40 }, 41 } 42 flags := cmd.Flags() 43 flags.VarP(&options.labels, "label", "l", "Secret labels") 44 flags.StringVarP(&options.driver, "driver", "d", "", "Secret driver") 45 flags.SetAnnotation("driver", "version", []string{"1.31"}) 46 flags.StringVar(&options.templateDriver, "template-driver", "", "Template driver") 47 flags.SetAnnotation("template-driver", "version", []string{"1.37"}) 48 49 return cmd 50 } 51 52 func runSecretCreate(ctx context.Context, dockerCli command.Cli, options createOptions) error { 53 client := dockerCli.Client() 54 55 if options.driver != "" && options.file != "" { 56 return errors.Errorf("When using secret driver secret data must be empty") 57 } 58 59 secretData, err := readSecretData(dockerCli.In(), options.file) 60 if err != nil { 61 return errors.Errorf("Error reading content from %q: %v", options.file, err) 62 } 63 spec := swarm.SecretSpec{ 64 Annotations: swarm.Annotations{ 65 Name: options.name, 66 Labels: opts.ConvertKVStringsToMap(options.labels.GetAll()), 67 }, 68 Data: secretData, 69 } 70 if options.driver != "" { 71 spec.Driver = &swarm.Driver{ 72 Name: options.driver, 73 } 74 } 75 if options.templateDriver != "" { 76 spec.Templating = &swarm.Driver{ 77 Name: options.templateDriver, 78 } 79 } 80 r, err := client.SecretCreate(ctx, spec) 81 if err != nil { 82 return err 83 } 84 85 fmt.Fprintln(dockerCli.Out(), r.ID) 86 return nil 87 } 88 89 func readSecretData(in io.ReadCloser, file string) ([]byte, error) { 90 // Read secret value from external driver 91 if file == "" { 92 return nil, nil 93 } 94 if file != "-" { 95 var err error 96 in, err = sequential.Open(file) 97 if err != nil { 98 return nil, err 99 } 100 defer in.Close() 101 } 102 data, err := io.ReadAll(in) 103 if err != nil { 104 return nil, err 105 } 106 return data, nil 107 }