-
Notifications
You must be signed in to change notification settings - Fork 3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: multiport support #2434
feat: multiport support #2434
Conversation
89c69ec
to
ef4a4a9
Compare
Merging This work (no virtual path):services:
merged-singleport-1: # 172.18.0.2
image: nginx:alpine
environment:
VIRTUAL_HOST: merged.nginx-proxy.tld
merged-singleport-2: # 172.18.0.3
image: nginx:alpine
environment:
VIRTUAL_HOST: merged.nginx-proxy.tld
VIRTUAL_PORT: "81"
merged-multiports: # 172.18.0.4
image: nginx:alpine
environment:
VIRTUAL_HOST_MULTIPORTS: |-
merged.nginx-proxy.tld:
"/":
port: 82 # merged.nginx-proxy.tld/
upstream merged.nginx-proxy.tld {
# Container: nginx-proxy-merged-multiports-1
# ...
# Container: nginx-proxy-merged-singleport-1-1
# ...
# Container: nginx-proxy-merged-singleport-2-1
# ...
server 172.18.0.4:82;
server 172.18.0.2:80;
server 172.18.0.3:81;
}
server {
server_name merged.nginx-proxy.tld;
# ...
location / {
proxy_pass http://merged.nginx-proxy.tld;
set $upstream_keepalive false;
}
} This work too (only virtual path):services:
merged-singleport-1: # 172.18.0.2
image: nginx:alpine
environment:
VIRTUAL_HOST: merged.nginx-proxy.tld
VIRTUAL_PATH: "/foo"
merged-singleport-2: # 172.18.0.3
image: nginx:alpine
environment:
VIRTUAL_HOST: merged.nginx-proxy.tld
VIRTUAL_PATH: "/foo"
VIRTUAL_PORT: "81"
merged-multiports: # 172.18.0.4
image: nginx:alpine
environment:
VIRTUAL_HOST_MULTIPORTS: |-
merged.nginx-proxy.tld:
"/foo":
port: 82 # merged.nginx-proxy.tld/foo
upstream merged.nginx-proxy.tld-6dbd548cc03e44b8b44b6e68e56255ce4273ae49 {
# Container: nginx-proxy-merged-multiports-1
# ...
# Container: nginx-proxy-merged-singleport-1-1
# ...
# Container: nginx-proxy-merged-singleport-2-1
# ...
server 172.18.0.4:82;
server 172.18.0.2:80;
server 172.18.0.3:81;
}
server {
server_name merged.nginx-proxy.tld;
# ...
location /foo {
proxy_pass http://merged.nginx-proxy.tld-6dbd548cc03e44b8b44b6e68e56255ce4273ae49;
set $upstream_keepalive false;
}
location / {
return 404;
}
} This work too (root path on multiport container only):services:
merged-singleport-2: # 172.18.0.3
image: nginx:alpine
environment:
VIRTUAL_HOST: merged.nginx-proxy.tld
VIRTUAL_PATH: "/foo"
VIRTUAL_PORT: "81"
merged-multiports: # 172.18.0.4
image: nginx:alpine
environment:
VIRTUAL_HOST_MULTIPORTS: |-
merged.nginx-proxy.tld:
"/":
port: 82
"/foo":
port: 83 # merged.nginx-proxy.tld/
upstream merged.nginx-proxy.tld {
# Container: nginx-proxy-merged-multiports-1
# ...
server 172.18.0.4:82;
}
# merged.nginx-proxy.tld/foo
upstream merged.nginx-proxy.tld-6dbd548cc03e44b8b44b6e68e56255ce4273ae49 {
# Container: nginx-proxy-merged-multiports-1
# ...
# Container: nginx-proxy-merged-singleport-2-1
# ...
server 172.18.0.4:83;
server 172.18.0.3:81;
}
server {
server_name merged.nginx-proxy.tld;
# ...
location / {
proxy_pass http://merged.nginx-proxy.tld;
set $upstream_keepalive false;
}
location /foo {
proxy_pass http://merged.nginx-proxy.tld-6dbd548cc03e44b8b44b6e68e56255ce4273ae49;
set $upstream_keepalive false;
}
} This doesn't (the first container's config is seemingly discarded):services:
merged-singleport-1: # 172.18.0.2
image: nginx:alpine
environment:
VIRTUAL_HOST: merged.nginx-proxy.tld
merged-singleport-2: # 172.18.0.3
image: nginx:alpine
environment:
VIRTUAL_HOST: merged.nginx-proxy.tld
VIRTUAL_PATH: "/foo"
VIRTUAL_PORT: "81"
merged-multiports: # 172.18.0.4
image: nginx:alpine
environment:
VIRTUAL_HOST_MULTIPORTS: |-
merged.nginx-proxy.tld:
"/":
port: 82
"/foo":
port: 84 # merged.nginx-proxy.tld/
upstream merged.nginx-proxy.tld {
# Container: nginx-proxy-merged-multiports-1
# ...
# /!\ nginx-proxy-singleport-1-1 should be here /!\
server 172.18.0.4:82;
}
# merged.nginx-proxy.tld/foo
upstream merged.nginx-proxy.tld-6dbd548cc03e44b8b44b6e68e56255ce4273ae49 {
# Container: nginx-proxy-merged-multiports-1
# ...
# Container: nginx-proxy-merged-singleport-2-1
# ...
server 172.18.0.4:83;
server 172.18.0.3:81;
}
server {
server_name merged.nginx-proxy.tld;
# ...
location / {
proxy_pass http://merged.nginx-proxy.tld;
set $upstream_keepalive false;
}
location /foo {
proxy_pass http://merged.nginx-proxy.tld-6dbd548cc03e44b8b44b6e68e56255ce4273ae49;
set $upstream_keepalive false;
}
} |
It is the case on the branch Because this block:
silently discards containers with no |
Could be replaced with:
I couldn't find a simpler way because docker-gen |
I've tried that earlier an ran into the same dockergen I think a cleaner approach might be to add a
I have it ready on a local branch and tested it with a modified template, seems to work like a charm. While I'm at it, maybe |
Sure. |
(See #1504) Using variable VIRTUAL_HOST_MULTIPORTS as a dictionnary: key: hostname value: dictionnary: key: path value: struct port dest When the dictionnary associated with a hostname is empty, default values apply: path = "/" port = default port dest = "" For each path entry, port and dest are optionnal and are assigned default values when missing. Example: VIRTUAL_HOST_MULTIPORTS: | host1.example.org: "/": port: 8000 "/somewhere": port: 9000 dest: "/elsewhere" host2.example.org: host3.example.org: "/inner/path":
For containers grouped by identical VIRTUAL_HOST, those with no VIRTUAL_PATH variable were silently discarded when at least one container with VIRTUAL_PATH existed.
This comment was marked as resolved.
This comment was marked as resolved.
I think we're pretty much done in term of documentation and tests here, marking the PR as ready for review. |
LGTM. Please go ahead 👍 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Co-authored-by: Niek <[email protected]>
This PR adds the ability to proxy to multiple ports on a single container using a new
VIRTUAL_HOST_MULTIPORTS
variable that take a YAML (or JSON) representation of the desired hostname / path / port / dest setup and completely override theVIRTUAL_HOST
,VIRTUAL_PORT
,VIRTUAL_PATH
andVIRTUAL_DEST
variables.See #1504 for the previous discussion on this feature.
Thanks to @pini-gh for the actual feature's code.
Close #560
Close #911
Close #939
Close #1042
Close #1066
Close #1112
Close #1382
Close #1463
Close #1504
Close #2050
Supersede #259, #1405 and #2130