Преглед изворни кода

feat: support proxy + container in host network mode

Nicolas Duchon пре 2 година
родитељ
комит
35b1493e16

+ 6 - 0
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

+ 8 - 0
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]

+ 13 - 0
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"

+ 26 - 0
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