diff --git a/internal/docker/container.go b/internal/docker/container.go index e4ac911a..ad75c39e 100644 --- a/internal/docker/container.go +++ b/internal/docker/container.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/docker/docker/api/types/container" + "github.com/docker/go-connections/nat" "github.com/yusing/go-proxy/agent/pkg/agent" config "github.com/yusing/go-proxy/internal/config/types" "github.com/yusing/go-proxy/internal/gperr" @@ -218,13 +219,15 @@ func (c *Container) UpdatePorts() error { } for port := range inspect.Config.ExposedPorts { - if port.Int() == 0 { + proto, portStr := nat.SplitProtoPort(string(port)) + portInt, _ := nat.ParsePort(portStr) + if portInt == 0 { continue } - c.PublicPortMapping[port.Int()] = container.Port{ - PublicPort: uint16(port.Int()), - PrivatePort: uint16(port.Int()), - Type: port.Proto(), + c.PublicPortMapping[portInt] = container.Port{ + PublicPort: uint16(portInt), + PrivatePort: uint16(portInt), + Type: proto, } } return nil diff --git a/internal/docker/container_test.go b/internal/docker/container_test.go index 0e9b5784..b9ea2caa 100644 --- a/internal/docker/container_test.go +++ b/internal/docker/container_test.go @@ -41,3 +41,38 @@ func TestContainerExplicit(t *testing.T) { }) } } + +func TestContainerHostNetworkMode(t *testing.T) { + tests := []struct { + name string + container *container.SummaryTrimmed + isHostNetworkMode bool + }{ + { + name: "host network mode", + container: &container.SummaryTrimmed{ + Names: []string{"test"}, + State: "test", + HostConfig: struct { + NetworkMode string "json:\",omitempty\"" + }{ + NetworkMode: "host", + }, + }, + isHostNetworkMode: true, + }, + { + name: "not host network mode", + container: &container.SummaryTrimmed{ + Names: []string{"test"}, + State: "test", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := FromDocker(tt.container, "") + ExpectEqual(t, c.IsHostNetworkMode, tt.isHostNetworkMode) + }) + } +} diff --git a/internal/route/route.go b/internal/route/route.go index 62a1ad51..6a89c8fe 100644 --- a/internal/route/route.go +++ b/internal/route/route.go @@ -409,7 +409,11 @@ func (r *Route) Finalize() { if pp == 0 { switch { case isDocker: - pp = preferredPort(cont.PrivatePortMapping) + if cont.IsHostNetworkMode { + pp = preferredPort(cont.PublicPortMapping) + } else { + pp = preferredPort(cont.PrivatePortMapping) + } case r.Scheme == "https": pp = 443 default: