github.com/docker/app@v0.9.1-beta3.0.20210611140623-a48f773ab002/cmd/cnab-run/install.go (about) 1 package main 2 3 import ( 4 "encoding/json" 5 "io/ioutil" 6 "os" 7 "strconv" 8 9 "github.com/docker/app/internal" 10 "github.com/docker/app/internal/packager" 11 "github.com/docker/app/render" 12 "github.com/docker/cli/cli/command" 13 "github.com/docker/cli/cli/command/stack" 14 "github.com/docker/cli/cli/command/stack/options" 15 "github.com/docker/cli/cli/command/stack/swarm" 16 composetypes "github.com/docker/cli/cli/compose/types" 17 "github.com/pkg/errors" 18 "github.com/spf13/pflag" 19 ) 20 21 func installAction(instanceName string) error { 22 cli, err := setupDockerContext() 23 if err != nil { 24 return errors.Wrap(err, "unable to restore docker context") 25 } 26 app, err := packager.Extract("") 27 // todo: merge additional compose file 28 if err != nil { 29 return err 30 } 31 defer app.Cleanup() 32 33 orchestratorRaw := os.Getenv(internal.DockerStackOrchestratorEnvVar) 34 orchestrator, err := cli.StackOrchestrator(orchestratorRaw) 35 if err != nil { 36 return err 37 } 38 bndl, err := getRelocatedBundle() 39 if err != nil { 40 return err 41 } 42 parameters := packager.ExtractCNABParametersValues(packager.ExtractCNABParameterMapping(app.Parameters()), os.Environ()) 43 rendered, err := render.Render(app, parameters, bndl.RelocatedImages()) 44 if err != nil { 45 return err 46 } 47 if err = addLabels(rendered); err != nil { 48 return err 49 } 50 addAppLabels(rendered, instanceName) 51 52 if err := os.Chdir(app.Path); err != nil { 53 return err 54 } 55 sendRegistryAuth, err := strconv.ParseBool(os.Getenv("DOCKER_SHARE_REGISTRY_CREDS")) 56 if err != nil { 57 return err 58 } 59 // todo: pass registry auth to invocation image 60 return stack.RunDeploy(cli, getFlagset(orchestrator), rendered, orchestrator, options.Deploy{ 61 Namespace: instanceName, 62 ResolveImage: swarm.ResolveImageAlways, 63 SendRegistryAuth: sendRegistryAuth, 64 }) 65 } 66 67 func getFlagset(orchestrator command.Orchestrator) *pflag.FlagSet { 68 result := pflag.NewFlagSet("", pflag.ContinueOnError) 69 if orchestrator == command.OrchestratorKubernetes { 70 result.String("namespace", os.Getenv(internal.DockerKubernetesNamespaceEnvVar), "") 71 } 72 return result 73 } 74 75 func addLabels(rendered *composetypes.Config) error { 76 args, err := ioutil.ReadFile(internal.DockerArgsPath) 77 if err != nil { 78 return err 79 } 80 var a packager.DockerAppArgs 81 if err := json.Unmarshal(args, &a); err != nil { 82 return err 83 } 84 for k, v := range a.Labels { 85 for i, service := range rendered.Services { 86 if service.Labels == nil { 87 service.Labels = map[string]string{} 88 } 89 service.Labels[k] = v 90 rendered.Services[i] = service 91 } 92 } 93 return nil 94 } 95 96 func addAppLabels(rendered *composetypes.Config, instanceName string) { 97 for i, service := range rendered.Services { 98 if service.Labels == nil { 99 service.Labels = map[string]string{} 100 } 101 service.Labels[internal.LabelAppNamespace] = instanceName 102 service.Labels[internal.LabelAppVersion] = internal.Version 103 rendered.Services[i] = service 104 } 105 }