@@ -442,6 +442,11 @@ func (daemon *Daemon) updateContainerNetworkSettings(container *container.Contai
442442 for name , epConfig := range endpointsConfig {
443443 container .NetworkSettings .Networks [name ] = & network.EndpointSettings {
444444 EndpointSettings : epConfig ,
445+ // At this point, during container creation, epConfig.MacAddress is the
446+ // configured value from the API. If there is no configured value, the
447+ // same field will later be used to store a generated MAC address. So,
448+ // remember the requested address now.
449+ DesiredMacAddress : epConfig .MacAddress ,
445450 }
446451 }
447452 }
@@ -508,7 +513,7 @@ func (daemon *Daemon) allocateNetwork(cfg *config.Config, container *container.C
508513 defaultNetName := runconfig .DefaultDaemonNetworkMode ().NetworkName ()
509514 if nConf , ok := container .NetworkSettings .Networks [defaultNetName ]; ok {
510515 cleanOperationalData (nConf )
511- if err := daemon .connectToNetwork (cfg , container , defaultNetName , nConf . EndpointSettings , updateSettings ); err != nil {
516+ if err := daemon .connectToNetwork (cfg , container , defaultNetName , nConf , updateSettings ); err != nil {
512517 return err
513518 }
514519 }
@@ -525,7 +530,7 @@ func (daemon *Daemon) allocateNetwork(cfg *config.Config, container *container.C
525530
526531 for netName , epConf := range networks {
527532 cleanOperationalData (epConf )
528- if err := daemon .connectToNetwork (cfg , container , netName , epConf . EndpointSettings , updateSettings ); err != nil {
533+ if err := daemon .connectToNetwork (cfg , container , netName , epConf , updateSettings ); err != nil {
529534 return err
530535 }
531536 }
@@ -634,12 +639,10 @@ func cleanOperationalData(es *network.EndpointSettings) {
634639 es .IPv6Gateway = ""
635640 es .GlobalIPv6Address = ""
636641 es .GlobalIPv6PrefixLen = 0
642+ es .MacAddress = ""
637643 if es .IPAMOperational {
638644 es .IPAMConfig = nil
639645 }
640- if es .MACOperational {
641- es .MacAddress = ""
642- }
643646}
644647
645648func (daemon * Daemon ) updateNetworkConfig (container * container.Container , n * libnetwork.Network , endpointConfig * networktypes.EndpointSettings , updateSettings bool ) error {
@@ -682,7 +685,7 @@ func buildEndpointDNSNames(ctr *container.Container, aliases []string) []string
682685 return sliceutil .Dedup (dnsNames )
683686}
684687
685- func (daemon * Daemon ) connectToNetwork (cfg * config.Config , container * container.Container , idOrName string , endpointConfig * networktypes .EndpointSettings , updateSettings bool ) (retErr error ) {
688+ func (daemon * Daemon ) connectToNetwork (cfg * config.Config , container * container.Container , idOrName string , endpointConfig * network .EndpointSettings , updateSettings bool ) (retErr error ) {
686689 start := time .Now ()
687690 if container .HostConfig .NetworkMode .IsContainer () {
688691 return runconfig .ErrConflictSharedNetwork
@@ -692,10 +695,12 @@ func (daemon *Daemon) connectToNetwork(cfg *config.Config, container *container.
692695 return nil
693696 }
694697 if endpointConfig == nil {
695- endpointConfig = & networktypes.EndpointSettings {}
698+ endpointConfig = & network.EndpointSettings {
699+ EndpointSettings : & networktypes.EndpointSettings {},
700+ }
696701 }
697702
698- n , nwCfg , err := daemon .findAndAttachNetwork (container , idOrName , endpointConfig )
703+ n , nwCfg , err := daemon .findAndAttachNetwork (container , idOrName , endpointConfig . EndpointSettings )
699704 if err != nil {
700705 return err
701706 }
@@ -710,26 +715,20 @@ func (daemon *Daemon) connectToNetwork(cfg *config.Config, container *container.
710715 }
711716 }
712717
713- var operIPAM bool
714- operMAC := true
718+ endpointConfig .IPAMOperational = false
715719 if nwCfg != nil {
716720 if epConfig , ok := nwCfg .EndpointsConfig [nwName ]; ok {
717721 if endpointConfig .IPAMConfig == nil || (endpointConfig .IPAMConfig .IPv4Address == "" && endpointConfig .IPAMConfig .IPv6Address == "" && len (endpointConfig .IPAMConfig .LinkLocalIPs ) == 0 ) {
718- operIPAM = true
722+ endpointConfig . IPAMOperational = true
719723 }
720724
721725 // copy IPAMConfig and NetworkID from epConfig via AttachNetwork
722726 endpointConfig .IPAMConfig = epConfig .IPAMConfig
723727 endpointConfig .NetworkID = epConfig .NetworkID
724-
725- // Work out whether the MAC address is user-configured.
726- operMAC = endpointConfig .MacAddress == ""
727- // Copy the configured MAC address (which may be empty).
728- endpointConfig .MacAddress = epConfig .MacAddress
729728 }
730729 }
731730
732- if err := daemon .updateNetworkConfig (container , n , endpointConfig , updateSettings ); err != nil {
731+ if err := daemon .updateNetworkConfig (container , n , endpointConfig . EndpointSettings , updateSettings ); err != nil {
733732 return err
734733 }
735734
@@ -752,11 +751,7 @@ func (daemon *Daemon) connectToNetwork(cfg *config.Config, container *container.
752751 }
753752 }
754753 }()
755- container .NetworkSettings .Networks [nwName ] = & network.EndpointSettings {
756- EndpointSettings : endpointConfig ,
757- IPAMOperational : operIPAM ,
758- MACOperational : operMAC ,
759- }
754+ container .NetworkSettings .Networks [nwName ] = endpointConfig
760755
761756 delete (container .NetworkSettings .Networks , n .ID ())
762757
@@ -1060,7 +1055,10 @@ func (daemon *Daemon) ConnectToNetwork(container *container.Container, idOrName
10601055 }
10611056 }
10621057 } else {
1063- if err := daemon .connectToNetwork (& daemon .config ().Config , container , idOrName , endpointConfig , true ); err != nil {
1058+ epc := & network.EndpointSettings {
1059+ EndpointSettings : endpointConfig ,
1060+ }
1061+ if err := daemon .connectToNetwork (& daemon .config ().Config , container , idOrName , epc , true ); err != nil {
10641062 return err
10651063 }
10661064 }
0 commit comments