diff --git a/pkg/compose/convergence_test.go b/pkg/compose/convergence_test.go index 843689a112..2a02f7e175 100644 --- a/pkg/compose/convergence_test.go +++ b/pkg/compose/convergence_test.go @@ -30,8 +30,10 @@ import ( "github.com/docker/docker/api/types/image" "github.com/docker/docker/api/types/network" "github.com/docker/go-connections/nat" + "github.com/stretchr/testify/require" "go.uber.org/mock/gomock" "gotest.tools/v3/assert" + "gotest.tools/v3/assert/cmp" "github.com/docker/compose/v5/pkg/api" "github.com/docker/compose/v5/pkg/mocks" @@ -425,3 +427,42 @@ func TestCreateMobyContainer(t *testing.T) { assert.NilError(t, err) }) } + +func TestDefaultNetworkSettingsGwPrioritySelectsPrimaryNetwork(t *testing.T) { + project := &types.Project{ + Name: "test", + Networks: map[string]types.NetworkConfig{ + "net1": {Name: "net1"}, + "net2": {Name: "net2"}, + }, + } + + service := types.ServiceConfig{ + Name: "svc", + Networks: map[string]*types.ServiceNetworkConfig{ + "net1": {GatewayPriority: 0}, + "net2": {GatewayPriority: 100}, + }, + } + + mode, netConfig, err := defaultNetworkSettings( + project, + service, + 0, + nil, + false, + APIVersion144, + ) + + require.NoError(t, err) + require.NotNil(t, netConfig) + + endpoints := netConfig.EndpointsConfig + require.Len(t, endpoints, 2) + + assert.Assert(t, cmp.Contains(endpoints, "net1")) + assert.Assert(t, cmp.Contains(endpoints, "net2")) + + // gw_priority must only affect primary network selection + assert.Assert(t, cmp.Equal(container.NetworkMode("net1"), mode)) +} diff --git a/pkg/compose/create.go b/pkg/compose/create.go index e4293cefbd..29e281fb27 100644 --- a/pkg/compose/create.go +++ b/pkg/compose/create.go @@ -519,8 +519,17 @@ func defaultNetworkSettings(project *types.Project, } else { primaryNetworkKey = "default" } + primaryNetworkMobyNetworkName := project.Networks[primaryNetworkKey].Name - primaryNetworkEndpoint := createEndpointSettings(project, service, serviceIndex, primaryNetworkKey, links, useNetworkAliases) + primaryNetworkEndpoint := createEndpointSettings( + project, + service, + serviceIndex, + primaryNetworkKey, + links, + useNetworkAliases, + ) + endpointsConfig := map[string]*network.EndpointSettings{} // Starting from API version 1.44, the Engine will take several EndpointsConfigs @@ -532,7 +541,14 @@ func defaultNetworkSettings(project *types.Project, serviceNetworks := service.NetworksByPriority() for _, networkKey := range serviceNetworks[1:] { mobyNetworkName := project.Networks[networkKey].Name - epSettings := createEndpointSettings(project, service, serviceIndex, networkKey, links, useNetworkAliases) + epSettings := createEndpointSettings( + project, + service, + serviceIndex, + networkKey, + links, + useNetworkAliases, + ) endpointsConfig[mobyNetworkName] = epSettings } } @@ -544,12 +560,17 @@ func defaultNetworkSettings(project *types.Project, if versions.LessThan(version, APIVersion149) { for _, config := range service.Networks { if config != nil && config.InterfaceName != "" { - return "", nil, fmt.Errorf("interface_name requires Docker Engine %s or later", DockerEngineV28_1) + return "", nil, fmt.Errorf( + "interface_name requires Docker Engine %s or later", + DockerEngineV28_1, + ) } } } + // Include the primary network endpointsConfig[primaryNetworkMobyNetworkName] = primaryNetworkEndpoint + networkConfig := &network.NetworkingConfig{ EndpointsConfig: endpointsConfig, }