mirror of
https://github.com/containers/podman-compose.git
synced 2025-02-06 05:20:01 +01:00
Merge pull request #1088 from lisongmin/feat-default-net-behavior-compat
Support docker-compose like default network behavior
This commit is contained in:
commit
d803c4c3e8
@ -110,6 +110,26 @@ x-podman:
|
|||||||
By default `default_net_name_compat` is `false`. This will change to `true` at some point and the
|
By default `default_net_name_compat` is `false`. This will change to `true` at some point and the
|
||||||
setting will be removed.
|
setting will be removed.
|
||||||
|
|
||||||
|
## Compatibility of default network behavior between docker-compose and podman-compose
|
||||||
|
|
||||||
|
When there is no network defined (neither network-mode nor networks) in service,
|
||||||
|
The behavior of default network in docker-compose and podman-compose are different.
|
||||||
|
|
||||||
|
| Top-level networks | podman-compose | docker-compose |
|
||||||
|
| ------------------------------ | -------------------------- | -------------- |
|
||||||
|
| No networks | default | default |
|
||||||
|
| One network named net0 | net0 | default |
|
||||||
|
| Two networks named net0, net1 | podman(`--network=bridge`) | default |
|
||||||
|
| Contains network named default | default | default |
|
||||||
|
|
||||||
|
To enable compatibility between docker-compose and podman-compose, specify
|
||||||
|
`default_net_behavior_compat: true` under global `x-podman` key:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
x-podman:
|
||||||
|
default_net_behavior_compat: true
|
||||||
|
```
|
||||||
|
|
||||||
## Custom pods management
|
## Custom pods management
|
||||||
|
|
||||||
Podman-compose can have containers in pods. This can be controlled by extension key x-podman in_pod.
|
Podman-compose can have containers in pods. This can be controlled by extension key x-podman in_pod.
|
||||||
|
2
newsfragments/default_net_behavior_compat.feature
Normal file
2
newsfragments/default_net_behavior_compat.feature
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Support docker-compose like default network behavior when no network defined in service via `default_net_behavior_compat` feature flag.
|
||||||
|
|
@ -1998,13 +1998,23 @@ class PodmanCompose:
|
|||||||
nets = compose.get("networks", {})
|
nets = compose.get("networks", {})
|
||||||
if not nets:
|
if not nets:
|
||||||
nets["default"] = None
|
nets["default"] = None
|
||||||
|
|
||||||
self.networks = nets
|
self.networks = nets
|
||||||
if len(self.networks) == 1:
|
if compose.get("x-podman", {}).get("default_net_behavior_compat", False):
|
||||||
self.default_net = list(nets.keys())[0]
|
# If there is no network_mode and networks in service,
|
||||||
elif "default" in nets:
|
# docker-compose will create default network named '<project_name>_default'
|
||||||
self.default_net = "default"
|
# and add the service to the default network.
|
||||||
|
# So we always set `default_net = 'default'` for compatibility
|
||||||
|
if "default" not in self.networks:
|
||||||
|
self.networks["default"] = None
|
||||||
else:
|
else:
|
||||||
self.default_net = None
|
if len(self.networks) == 1:
|
||||||
|
self.default_net = list(nets.keys())[0]
|
||||||
|
elif "default" in nets:
|
||||||
|
self.default_net = "default"
|
||||||
|
else:
|
||||||
|
self.default_net = None
|
||||||
|
|
||||||
allnets = set()
|
allnets = set()
|
||||||
for name, srv in services.items():
|
for name, srv in services.items():
|
||||||
srv_nets = srv.get("networks", self.default_net)
|
srv_nets = srv.get("networks", self.default_net)
|
||||||
|
@ -0,0 +1,4 @@
|
|||||||
|
services:
|
||||||
|
web:
|
||||||
|
image: busybox
|
||||||
|
command: httpd -f -p 8123 -h /tmp/
|
@ -0,0 +1,7 @@
|
|||||||
|
services:
|
||||||
|
web:
|
||||||
|
image: busybox
|
||||||
|
command: httpd -f -p 8123 -h /tmp/
|
||||||
|
|
||||||
|
x-podman:
|
||||||
|
default_net_behavior_compat: true
|
@ -0,0 +1,7 @@
|
|||||||
|
services:
|
||||||
|
web:
|
||||||
|
image: busybox
|
||||||
|
command: httpd -f -p 8123 -h /tmp/
|
||||||
|
|
||||||
|
networks:
|
||||||
|
net0: {}
|
@ -0,0 +1,10 @@
|
|||||||
|
services:
|
||||||
|
web:
|
||||||
|
image: busybox
|
||||||
|
command: httpd -f -p 8123 -h /tmp/
|
||||||
|
|
||||||
|
networks:
|
||||||
|
net0: {}
|
||||||
|
|
||||||
|
x-podman:
|
||||||
|
default_net_behavior_compat: true
|
@ -0,0 +1,8 @@
|
|||||||
|
services:
|
||||||
|
web:
|
||||||
|
image: busybox
|
||||||
|
command: httpd -f -p 8123 -h /tmp/
|
||||||
|
|
||||||
|
networks:
|
||||||
|
net0: {}
|
||||||
|
net1: {}
|
@ -0,0 +1,11 @@
|
|||||||
|
services:
|
||||||
|
web:
|
||||||
|
image: busybox
|
||||||
|
command: httpd -f -p 8123 -h /tmp/
|
||||||
|
|
||||||
|
networks:
|
||||||
|
net0: {}
|
||||||
|
net1: {}
|
||||||
|
|
||||||
|
x-podman:
|
||||||
|
default_net_behavior_compat: true
|
@ -0,0 +1,9 @@
|
|||||||
|
services:
|
||||||
|
web:
|
||||||
|
image: busybox
|
||||||
|
command: httpd -f -p 8123 -h /tmp/
|
||||||
|
|
||||||
|
networks:
|
||||||
|
net0: {}
|
||||||
|
net1: {}
|
||||||
|
default: {}
|
@ -0,0 +1,12 @@
|
|||||||
|
services:
|
||||||
|
web:
|
||||||
|
image: busybox
|
||||||
|
command: httpd -f -p 8123 -h /tmp/
|
||||||
|
|
||||||
|
networks:
|
||||||
|
net0: {}
|
||||||
|
net1: {}
|
||||||
|
default: {}
|
||||||
|
|
||||||
|
x-podman:
|
||||||
|
default_net_behavior_compat: true
|
@ -0,0 +1,65 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
|
import os
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
from parameterized import parameterized
|
||||||
|
|
||||||
|
from tests.integration.test_podman_compose import podman_compose_path
|
||||||
|
from tests.integration.test_podman_compose import test_path
|
||||||
|
from tests.integration.test_utils import RunSubprocessMixin
|
||||||
|
|
||||||
|
|
||||||
|
def compose_yaml_path(scenario):
|
||||||
|
return os.path.join(
|
||||||
|
os.path.join(test_path(), "default_net_behavior"), f"docker-compose_{scenario}.yaml"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TestComposeDefaultNetBehavior(unittest.TestCase, RunSubprocessMixin):
|
||||||
|
@parameterized.expand([
|
||||||
|
('no_nets', 'default_net_behavior_default'),
|
||||||
|
('one_net', 'default_net_behavior_net0'),
|
||||||
|
('two_nets', 'podman'),
|
||||||
|
('with_default', 'default_net_behavior_default'),
|
||||||
|
('no_nets_compat', 'default_net_behavior_default'),
|
||||||
|
('one_net_compat', 'default_net_behavior_default'),
|
||||||
|
('two_nets_compat', 'default_net_behavior_default'),
|
||||||
|
('with_default_compat', 'default_net_behavior_default'),
|
||||||
|
])
|
||||||
|
def test_nethost(self, scenario, default_net):
|
||||||
|
try:
|
||||||
|
self.run_subprocess_assert_returncode(
|
||||||
|
[podman_compose_path(), "-f", compose_yaml_path(scenario), "up", "-d"],
|
||||||
|
)
|
||||||
|
|
||||||
|
container_id, _ = self.run_subprocess_assert_returncode(
|
||||||
|
[
|
||||||
|
podman_compose_path(),
|
||||||
|
"-f",
|
||||||
|
compose_yaml_path(scenario),
|
||||||
|
"ps",
|
||||||
|
"--format",
|
||||||
|
'{{.ID}}',
|
||||||
|
],
|
||||||
|
)
|
||||||
|
container_id = container_id.decode('utf-8').split('\n')[0]
|
||||||
|
output, _ = self.run_subprocess_assert_returncode(
|
||||||
|
[
|
||||||
|
"podman",
|
||||||
|
"inspect",
|
||||||
|
container_id,
|
||||||
|
"--format",
|
||||||
|
"{{range $key, $value := .NetworkSettings.Networks }}{{ $key }}\n{{ end }}",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
self.assertEqual(output.decode('utf-8').strip(), default_net)
|
||||||
|
finally:
|
||||||
|
self.run_subprocess_assert_returncode([
|
||||||
|
podman_compose_path(),
|
||||||
|
"-f",
|
||||||
|
compose_yaml_path(scenario),
|
||||||
|
"down",
|
||||||
|
"-t",
|
||||||
|
"0",
|
||||||
|
])
|
Loading…
Reference in New Issue
Block a user