From 19cf2b3d5fe62aa62b022311b750af37350aaf35 Mon Sep 17 00:00:00 2001 From: Vincent Demeester Date: Mon, 9 Jan 2017 11:58:06 +0100 Subject: [PATCH 1/2] Fix external network name not properly handle by stack deploy Make sure we use the Network external name if it's not empty. Signed-off-by: Vincent Demeester --- cli/command/stack/deploy.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/cli/command/stack/deploy.go b/cli/command/stack/deploy.go index 8a18cff43a..9ff9074f59 100644 --- a/cli/command/stack/deploy.go +++ b/cli/command/stack/deploy.go @@ -9,9 +9,6 @@ import ( "strings" "time" - "github.com/spf13/cobra" - "golang.org/x/net/context" - "github.com/aanand/compose-file/loader" composetypes "github.com/aanand/compose-file/types" "github.com/docker/docker/api/types" @@ -25,6 +22,8 @@ import ( "github.com/docker/docker/opts" runconfigopts "github.com/docker/docker/runconfig/opts" "github.com/docker/go-connections/nat" + "github.com/spf13/cobra" + "golang.org/x/net/context" ) const ( @@ -310,7 +309,7 @@ func convertServiceNetworks( } target := namespace.scope(networkName) if networkConfig.External.External { - target = networkName + target = networkConfig.External.Name } nets = append(nets, swarm.NetworkAttachmentConfig{ Target: target, From 462cd90f749bca0688827bb640219d96cef3c526 Mon Sep 17 00:00:00 2001 From: Vincent Demeester Date: Mon, 9 Jan 2017 12:56:58 +0100 Subject: [PATCH 2/2] Create only network that are used - default network is only created if needed - it's possible to override default network configuration Signed-off-by: Vincent Demeester --- cli/command/stack/deploy.go | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/cli/command/stack/deploy.go b/cli/command/stack/deploy.go index 9ff9074f59..d9beed9cc2 100644 --- a/cli/command/stack/deploy.go +++ b/cli/command/stack/deploy.go @@ -122,7 +122,8 @@ func deployCompose(ctx context.Context, dockerCli *command.DockerCli, opts deplo namespace := namespace{name: opts.namespace} - networks, externalNetworks := convertNetworks(namespace, config.Networks) + serviceNetworks := getServicesDeclaredNetworks(config.Services) + networks, externalNetworks := convertNetworks(namespace, config.Networks, serviceNetworks) if err := validateExternalNetworks(ctx, dockerCli, externalNetworks); err != nil { return err } @@ -135,6 +136,19 @@ func deployCompose(ctx context.Context, dockerCli *command.DockerCli, opts deplo } return deployServices(ctx, dockerCli, services, namespace, opts.sendRegistryAuth) } +func getServicesDeclaredNetworks(serviceConfigs []composetypes.ServiceConfig) map[string]struct{} { + serviceNetworks := map[string]struct{}{} + for _, serviceConfig := range serviceConfigs { + if len(serviceConfig.Networks) == 0 { + serviceNetworks["default"] = struct{}{} + continue + } + for network := range serviceConfig.Networks { + serviceNetworks[network] = struct{}{} + } + } + return serviceNetworks +} func propertyWarnings(properties map[string]string) string { var msgs []string @@ -181,18 +195,17 @@ func getConfigFile(filename string) (*composetypes.ConfigFile, error) { func convertNetworks( namespace namespace, networks map[string]composetypes.NetworkConfig, + servicesNetworks map[string]struct{}, ) (map[string]types.NetworkCreate, []string) { if networks == nil { networks = make(map[string]composetypes.NetworkConfig) } - // TODO: only add default network if it's used - networks["default"] = composetypes.NetworkConfig{} - externalNetworks := []string{} result := make(map[string]types.NetworkCreate) - for internalName, network := range networks { + for internalName := range servicesNetworks { + network := networks[internalName] if network.External.External { externalNetworks = append(externalNetworks, network.External.Name) continue