diff --git a/pkg/api/handlers/compat/containers_create.go b/pkg/api/handlers/compat/containers_create.go index ea5716bbc5..234c101c81 100644 --- a/pkg/api/handlers/compat/containers_create.go +++ b/pkg/api/handlers/compat/containers_create.go @@ -287,6 +287,9 @@ func cliOpts(cc handlers.CreateContainerConfig, rtc *config.Config) (*entities.C NoHosts: rtc.Containers.NoHosts, } + // sigh docker-compose sets the mac address on the container config instead on the per network endpoint config + containerMacAddress := cc.MacAddress + // network names switch { case len(cc.NetworkingConfig.EndpointsConfig) > 0: @@ -331,6 +334,16 @@ func cliOpts(cc handlers.CreateContainerConfig, rtc *config.Config) (*entities.C return nil, nil, fmt.Errorf("failed to parse the mac address %q", endpoint.MacAddress) } netOpts.StaticMAC = types.HardwareAddr(staticMac) + } else if len(containerMacAddress) > 0 { + // docker-compose only sets one mac address for the container on the container config + // If there are more than one network attached it will end up on the first one, + // which is not deterministic since we iterate a map. Not nice but this matches docker. + staticMac, err := net.ParseMAC(containerMacAddress) + if err != nil { + return nil, nil, fmt.Errorf("failed to parse the mac address %q", containerMacAddress) + } + netOpts.StaticMAC = types.HardwareAddr(staticMac) + containerMacAddress = "" } } diff --git a/test/compose/ipam_set_ip/docker-compose.yml b/test/compose/ipam_set_ip/docker-compose.yml index d220c02c02..8dffee9964 100644 --- a/test/compose/ipam_set_ip/docker-compose.yml +++ b/test/compose/ipam_set_ip/docker-compose.yml @@ -2,6 +2,7 @@ version: "3.2" services: test: image: alpine + mac_address: 32:b5:b2:55:48:72 networks: net1: ipv4_address: 10.123.0.253 diff --git a/test/compose/ipam_set_ip/tests.sh b/test/compose/ipam_set_ip/tests.sh index b9e761ea2c..945303e52a 100644 --- a/test/compose/ipam_set_ip/tests.sh +++ b/test/compose/ipam_set_ip/tests.sh @@ -5,4 +5,6 @@ if [ "$TEST_FLAVOR" = "compose_v2" ]; then ctr_name="ipam_set_ip-test-1" fi podman container inspect "$ctr_name" --format '{{ .NetworkSettings.Networks.ipam_set_ip_net1.IPAddress }}' -like "$output" "10.123.0.253" "$testname : ip address is set" +is "$output" "10.123.0.253" "$testname : ip address is set" +podman container inspect "$ctr_name" --format '{{ .NetworkSettings.Networks.ipam_set_ip_net1.MacAddress }}' +is "$output" "32:b5:b2:55:48:72" "$testname : mac address is set"