defaultNetworkSettings determines the container.NetworkMode and corresponding network.NetworkingConfig (nil if not applicable).
(project *types.Project, service types.ServiceConfig, serviceIndex int, links []string, useNetworkAliases bool, version string, )
| 519 | |
| 520 | // defaultNetworkSettings determines the container.NetworkMode and corresponding network.NetworkingConfig (nil if not applicable). |
| 521 | func defaultNetworkSettings(project *types.Project, |
| 522 | service types.ServiceConfig, serviceIndex int, |
| 523 | links []string, useNetworkAliases bool, |
| 524 | version string, |
| 525 | ) (container.NetworkMode, *network.NetworkingConfig, error) { |
| 526 | if service.NetworkMode != "" { |
| 527 | return container.NetworkMode(service.NetworkMode), nil, nil |
| 528 | } |
| 529 | |
| 530 | if len(project.Networks) == 0 { |
| 531 | return network.NetworkNone, nil, nil |
| 532 | } |
| 533 | |
| 534 | if versions.LessThan(version, apiVersion149) { |
| 535 | for _, config := range service.Networks { |
| 536 | if config != nil && config.InterfaceName != "" { |
| 537 | return "", nil, fmt.Errorf("interface_name requires Docker Engine %s or later", DockerEngineV28_1) |
| 538 | } |
| 539 | } |
| 540 | } |
| 541 | |
| 542 | serviceNetworks := service.NetworksByPriority() |
| 543 | primaryNetworkKey := "default" |
| 544 | if len(serviceNetworks) > 0 { |
| 545 | primaryNetworkKey = serviceNetworks[0] |
| 546 | serviceNetworks = serviceNetworks[1:] |
| 547 | } |
| 548 | |
| 549 | primaryNetworkEndpoint, err := createEndpointSettings(project, service, serviceIndex, primaryNetworkKey, links, useNetworkAliases) |
| 550 | if err != nil { |
| 551 | return "", nil, err |
| 552 | } |
| 553 | if primaryNetworkEndpoint.MacAddress.String() == "" { |
| 554 | primaryNetworkEndpoint.MacAddress, err = parseMACAddr(service.MacAddress) |
| 555 | if err != nil { |
| 556 | return "", nil, err |
| 557 | } |
| 558 | } |
| 559 | |
| 560 | primaryNetworkMobyNetworkName := project.Networks[primaryNetworkKey].Name |
| 561 | endpointsConfig := map[string]*network.EndpointSettings{ |
| 562 | primaryNetworkMobyNetworkName: primaryNetworkEndpoint, |
| 563 | } |
| 564 | |
| 565 | // Starting from API version 1.44, the Engine will take several EndpointsConfigs |
| 566 | // so we can pass all the extra networks we want the container to be connected to |
| 567 | // in the network configuration instead of connecting the container to each extra |
| 568 | // network individually after creation. |
| 569 | // For older API versions, extra networks are connected via NetworkConnect after |
| 570 | // container creation (see createMobyContainer in convergence.go). |
| 571 | if !versions.LessThan(version, apiVersion144) { |
| 572 | for _, networkKey := range serviceNetworks { |
| 573 | epSettings, err := createEndpointSettings(project, service, serviceIndex, networkKey, links, useNetworkAliases) |
| 574 | if err != nil { |
| 575 | return "", nil, err |
| 576 | } |
| 577 | mobyNetworkName := project.Networks[networkKey].Name |
| 578 | endpointsConfig[mobyNetworkName] = epSettings |