From 2f5025a2d70823de87e7b1bf43563f0d182be3bb Mon Sep 17 00:00:00 2001 From: Paul Holzinger Date: Mon, 5 Dec 2022 16:52:36 +0100 Subject: [PATCH] compat API: allow MacAddress on container config docker-compose sets the mac address in the container config and not the network endpoint config. This is ugly when you have more than one network, in this case docker just chooses the first network. Fixes #16411 Signed-off-by: Paul Holzinger --- pkg/api/handlers/compat/containers_create.go | 13 +++++++++++++ test/compose/ipam_set_ip/docker-compose.yml | 1 + test/compose/ipam_set_ip/tests.sh | 4 +++- 3 files changed, 17 insertions(+), 1 deletion(-) 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"