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  }