From 35b1493e16a504a2bce15ffb7bb7be4ba4a0296a Mon Sep 17 00:00:00 2001 From: Nicolas Duchon Date: Tue, 9 May 2023 19:31:42 +0200 Subject: [PATCH] feat: support proxy + container in host network mode --- nginx.tmpl | 6 +++++ test/conftest.py | 8 ++++++ .../test_proxy-host-network-mode.py | 13 ++++++++++ .../test_proxy-host-network-mode.yml | 26 +++++++++++++++++++ 4 files changed, 53 insertions(+) create mode 100644 test/test_host-network-mode/test_proxy-host-network-mode.py create mode 100644 test/test_host-network-mode/test_proxy-host-network-mode.yml diff --git a/nginx.tmpl b/nginx.tmpl index 4aca11c..3f4b019 100644 --- a/nginx.tmpl +++ b/nginx.tmpl @@ -68,6 +68,12 @@ {{- continue }} {{- end }} {{- if eq .Name "host" }} + {{- /* Handle containers in host nework mode */}} + {{- if (index $.globals.networks "host") }} + # both container and proxy are in host network mode, using localhost IP + {{- $ip = "127.0.0.1" }} + {{- continue }} + {{- end }} {{- range sortObjectsByKeysAsc $.globals.CurrentContainer.Networks "Name" }} {{- if and . .Gateway }} # container is in host network mode, using {{ .Name }} gateway IP diff --git a/test/conftest.py b/test/conftest.py index e7133e7..d58d504 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -160,6 +160,10 @@ def container_ip(container: Container): net_info = container.attrs["NetworkSettings"]["Networks"] if "bridge" in net_info: return net_info["bridge"]["IPAddress"] + + # container is running in host network mode + if "host" in net_info: + return "127.0.0.1" # not default bridge network, fallback on first network defined network_name = list(net_info.keys())[0] @@ -173,6 +177,10 @@ def container_ipv6(container): net_info = container.attrs["NetworkSettings"]["Networks"] if "bridge" in net_info: return net_info["bridge"]["GlobalIPv6Address"] + + # container is running in host network mode + if "host" in net_info: + return "::1" # not default bridge network, fallback on first network defined network_name = list(net_info.keys())[0] diff --git a/test/test_host-network-mode/test_proxy-host-network-mode.py b/test/test_host-network-mode/test_proxy-host-network-mode.py new file mode 100644 index 0000000..330334b --- /dev/null +++ b/test/test_host-network-mode/test_proxy-host-network-mode.py @@ -0,0 +1,13 @@ +import pytest + + +def test_forwards_to_host_network_container_1(docker_compose, nginxproxy): + r = nginxproxy.get("http://host-network-1.nginx-proxy.tld:8888/port") + assert r.status_code == 200 + assert r.text == "answer from port 8080\n" + + +def test_forwards_to_host_network_container_2(docker_compose, nginxproxy): + r = nginxproxy.get("http://host-network-2.nginx-proxy.tld:8888/port") + assert r.status_code == 200 + assert r.text == "answer from port 8181\n" diff --git a/test/test_host-network-mode/test_proxy-host-network-mode.yml b/test/test_host-network-mode/test_proxy-host-network-mode.yml new file mode 100644 index 0000000..32106e2 --- /dev/null +++ b/test/test_host-network-mode/test_proxy-host-network-mode.yml @@ -0,0 +1,26 @@ +version: "2" + +services: + host-network-1: + image: web + environment: + WEB_PORTS: "8080" + VIRTUAL_HOST: "host-network-1.nginx-proxy.tld" + VIRTUAL_PORT: "8080" + network_mode: host + + host-network-2: + image: web + environment: + WEB_PORTS: "8181" + VIRTUAL_HOST: "host-network-2.nginx-proxy.tld" + VIRTUAL_PORT: "8181" + network_mode: host + + sut: + image: nginxproxy/nginx-proxy:test + volumes: + - /var/run/docker.sock:/tmp/docker.sock:ro + environment: + HTTP_PORT: 8888 + network_mode: host