diff --git a/container/container.go b/container/container.go index a6278f0f67..5b73672070 100644 --- a/container/container.go +++ b/container/container.go @@ -782,7 +782,7 @@ func (container *Container) BuildJoinOptions(n libnetwork.Network) ([]libnetwork } // BuildCreateEndpointOptions builds endpoint options from a given network. -func (container *Container) BuildCreateEndpointOptions(n libnetwork.Network, epConfig *networktypes.EndpointSettings, sb libnetwork.Sandbox) ([]libnetwork.EndpointOption, error) { +func (container *Container) BuildCreateEndpointOptions(n libnetwork.Network, epConfig *networktypes.EndpointSettings, sb libnetwork.Sandbox, daemonDNS []string) ([]libnetwork.EndpointOption, error) { var ( bindings = make(nat.PortMap) pbList []types.PortBinding @@ -792,7 +792,8 @@ func (container *Container) BuildCreateEndpointOptions(n libnetwork.Network, epC defaultNetName := runconfig.DefaultDaemonNetworkMode().NetworkName() - if n.Name() == defaultNetName || container.NetworkSettings.IsAnonymousEndpoint { + if (!container.EnableServiceDiscoveryOnDefaultNetwork() && n.Name() == defaultNetName) || + container.NetworkSettings.IsAnonymousEndpoint { createOptions = append(createOptions, libnetwork.CreateOptionAnonymous()) } @@ -914,6 +915,19 @@ func (container *Container) BuildCreateEndpointOptions(n libnetwork.Network, epC } } + var dns []string + + if len(container.HostConfig.DNS) > 0 { + dns = container.HostConfig.DNS + } else if len(daemonDNS) > 0 { + dns = daemonDNS + } + + if len(dns) > 0 { + createOptions = append(createOptions, + libnetwork.CreateOptionDNS(dns)) + } + createOptions = append(createOptions, libnetwork.CreateOptionPortMapping(pbList), libnetwork.CreateOptionExposedPorts(exposeList)) diff --git a/container/container_solaris.go b/container/container_solaris.go index 5c5b66e022..32c0edb6c4 100644 --- a/container/container_solaris.go +++ b/container/container_solaris.go @@ -93,3 +93,8 @@ func (container *Container) BuildHostnameFile() error { func (container *Container) canMountFS() bool { return true } + +// EnableServiceDiscoveryOnDefaultNetwork Enable service discovery on default network +func (container *Container) EnableServiceDiscoveryOnDefaultNetwork() bool { + return false +} diff --git a/container/container_unix.go b/container/container_unix.go index 22c07c2652..02e6ad81ba 100644 --- a/container/container_unix.go +++ b/container/container_unix.go @@ -428,3 +428,8 @@ func cleanResourcePath(path string) string { func (container *Container) canMountFS() bool { return true } + +// EnableServiceDiscoveryOnDefaultNetwork Enable service discovery on default network +func (container *Container) EnableServiceDiscoveryOnDefaultNetwork() bool { + return false +} diff --git a/container/container_windows.go b/container/container_windows.go index 0a6c7a8ff8..736c7e95d8 100644 --- a/container/container_windows.go +++ b/container/container_windows.go @@ -110,3 +110,8 @@ func (container *Container) BuildHostnameFile() error { func (container *Container) canMountFS() bool { return !containertypes.Isolation.IsHyperV(container.HostConfig.Isolation) } + +// EnableServiceDiscoveryOnDefaultNetwork Enable service discovery on default network +func (container *Container) EnableServiceDiscoveryOnDefaultNetwork() bool { + return true +} diff --git a/daemon/container_operations.go b/daemon/container_operations.go index 22883e0360..7ad97180dd 100644 --- a/daemon/container_operations.go +++ b/daemon/container_operations.go @@ -597,11 +597,12 @@ func cleanOperationalData(es *network.EndpointSettings) { } func (daemon *Daemon) updateNetworkConfig(container *container.Container, n libnetwork.Network, endpointConfig *networktypes.EndpointSettings, updateSettings bool) error { + if !containertypes.NetworkMode(n.Name()).IsUserDefined() { if hasUserDefinedIPAddress(endpointConfig) && !enableIPOnPredefinedNetwork() { return runconfig.ErrUnsupportedNetworkAndIP } - if endpointConfig != nil && len(endpointConfig.Aliases) > 0 { + if endpointConfig != nil && len(endpointConfig.Aliases) > 0 && !container.EnableServiceDiscoveryOnDefaultNetwork() { return runconfig.ErrUnsupportedNetworkAndAlias } } else { @@ -673,9 +674,8 @@ func (daemon *Daemon) connectToNetwork(container *container.Container, idOrName } controller := daemon.netController - sb := daemon.getNetworkSandbox(container) - createOptions, err := container.BuildCreateEndpointOptions(n, endpointConfig, sb) + createOptions, err := container.BuildCreateEndpointOptions(n, endpointConfig, sb, daemon.configStore.DNS) if err != nil { return err } diff --git a/daemon/start_windows.go b/daemon/start_windows.go index 710c8ccbf4..160a57e860 100644 --- a/daemon/start_windows.go +++ b/daemon/start_windows.go @@ -53,6 +53,7 @@ func (daemon *Daemon) getLibcontainerdCreateOptions(container *container.Contain // Get endpoints for the libnetwork allocated networks to the container var epList []string + AllowUnqualifiedDNSQuery := false if container.NetworkSettings != nil { for n := range container.NetworkSettings.Networks { sn, err := daemon.FindNetwork(n) @@ -72,6 +73,10 @@ func (daemon *Daemon) getLibcontainerdCreateOptions(container *container.Contain if data["hnsid"] != nil { epList = append(epList, data["hnsid"].(string)) } + + if data["AllowUnqualifiedDNSQuery"] != nil { + AllowUnqualifiedDNSQuery = true + } } } @@ -80,7 +85,7 @@ func (daemon *Daemon) getLibcontainerdCreateOptions(container *container.Contain createOptions = append(createOptions, hvOpts) createOptions = append(createOptions, layerOpts) if epList != nil { - createOptions = append(createOptions, &libcontainerd.NetworkEndpointsOption{Endpoints: epList}) + createOptions = append(createOptions, &libcontainerd.NetworkEndpointsOption{Endpoints: epList, AllowUnqualifiedDNSQuery: AllowUnqualifiedDNSQuery}) } return &createOptions, nil diff --git a/libcontainerd/client_windows.go b/libcontainerd/client_windows.go index e3cb7a8d62..b6a4b6b939 100644 --- a/libcontainerd/client_windows.go +++ b/libcontainerd/client_windows.go @@ -150,6 +150,7 @@ func (clnt *client) Create(containerID string, checkpoint string, checkpointDir } if n, ok := option.(*NetworkEndpointsOption); ok { configuration.EndpointList = n.Endpoints + configuration.AllowUnqualifiedDNSQuery = n.AllowUnqualifiedDNSQuery continue } } diff --git a/libcontainerd/types_windows.go b/libcontainerd/types_windows.go index 89652f1ff9..5a50771a74 100644 --- a/libcontainerd/types_windows.go +++ b/libcontainerd/types_windows.go @@ -64,7 +64,8 @@ type LayerOption struct { // NetworkEndpointsOption is a CreateOption that provides the runtime list // of network endpoints to which a container should be attached during its creation. type NetworkEndpointsOption struct { - Endpoints []string + Endpoints []string + AllowUnqualifiedDNSQuery bool } // Checkpoint holds the details of a checkpoint (not supported in windows)