From e8fb202ea9b9f4b93789a22f463e6cf11ffcfd75 Mon Sep 17 00:00:00 2001 From: yusing Date: Sat, 1 Nov 2025 02:10:09 +0800 Subject: [PATCH] fix(docker): fix wildcard not working correctly with #N ref aliases --- internal/docker/label.go | 11 +++++------ internal/docker/label_test.go | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/internal/docker/label.go b/internal/docker/label.go index 057efe17..c45d5c2c 100644 --- a/internal/docker/label.go +++ b/internal/docker/label.go @@ -87,8 +87,8 @@ func ExpandWildcard(labels map[string]string, aliases ...string) { wildcardLabels[parts[2]] = value continue } - // explicit alias label – remember the alias - if _, ok := aliasSet[alias]; !ok { + // explicit alias label – remember the alias (but not reference aliases like #1, #2) + if _, ok := aliasSet[alias]; !ok && !strings.HasPrefix(alias, "#") { aliasSet[alias] = len(aliasSet) } } @@ -100,10 +100,9 @@ func ExpandWildcard(labels map[string]string, aliases ...string) { // expand collected wildcard labels for every alias for suffix, v := range wildcardLabels { for alias, i := range aliasSet { - // for FQDN aliases, use numeric index instead of the alias name - if strings.Contains(alias, ".") { - alias = fmt.Sprintf("#%d", i+1) - } + // use numeric index instead of the alias name + alias = fmt.Sprintf("#%d", i+1) + key := fmt.Sprintf("%s.%s.%s", NSProxy, alias, suffix) if suffix == "" { // this should not happen (root wildcard handled earlier) but keep safe key = fmt.Sprintf("%s.%s", NSProxy, alias) diff --git a/internal/docker/label_test.go b/internal/docker/label_test.go index d50ec414..83b6fd19 100644 --- a/internal/docker/label_test.go +++ b/internal/docker/label_test.go @@ -67,6 +67,21 @@ healthcheck: }, labels) } +func TestWildcardWithRefAliases(t *testing.T) { + labels := map[string]string{ + "proxy.#1.host": "localhost", + "proxy.#1.port": "5555", + "proxy.*.middlewares.request.hide_headers": "X-Header1,X-Header2", + } + docker.ExpandWildcard(labels, "a.example.com", "b.example.com") + require.Equal(t, map[string]string{ + "proxy.#1.host": "localhost", + "proxy.#1.port": "5555", + "proxy.#1.middlewares.request.hide_headers": "X-Header1,X-Header2", + "proxy.#2.middlewares.request.hide_headers": "X-Header1,X-Header2", + }, labels) +} + func BenchmarkParseLabels(b *testing.B) { for b.Loop() { _, _ = docker.ParseLabels(map[string]string{