diff --git a/internal/docker/container.go b/internal/docker/container.go index 874cc8d..e4ac911 100644 --- a/internal/docker/container.go +++ b/internal/docker/container.go @@ -1,6 +1,7 @@ package docker import ( + "context" "net/url" "strconv" "strings" @@ -37,10 +38,11 @@ type ( PublicHostname string `json:"public_hostname"` PrivateHostname string `json:"private_hostname"` - Aliases []string `json:"aliases"` - IsExcluded bool `json:"is_excluded"` - IsExplicit bool `json:"is_explicit"` - Running bool `json:"running"` + Aliases []string `json:"aliases"` + IsExcluded bool `json:"is_excluded"` + IsExplicit bool `json:"is_explicit"` + IsHostNetworkMode bool `json:"is_host_network_mode"` + Running bool `json:"running"` } ContainerImage struct { Author string `json:"author,omitempty"` @@ -76,10 +78,11 @@ func FromDocker(c *container.SummaryTrimmed, dockerHost string) (res *Container) PublicPortMapping: helper.getPublicPortMapping(), PrivatePortMapping: helper.getPrivatePortMapping(), - Aliases: helper.getAliases(), - IsExcluded: isExcluded, - IsExplicit: isExplicit, - Running: c.Status == "running" || c.State == "running", + Aliases: helper.getAliases(), + IsExcluded: isExcluded, + IsExplicit: isExplicit, + IsHostNetworkMode: c.HostConfig.NetworkMode == "host", + Running: c.Status == "running" || c.State == "running", } if agent.IsDockerHostAgent(dockerHost) { @@ -201,3 +204,28 @@ func (c *Container) loadDeleteIdlewatcherLabels(helper containerHelper) { } } } + +func (c *Container) UpdatePorts() error { + client, err := NewClient(c.DockerHost) + if err != nil { + return err + } + defer client.Close() + + inspect, err := client.ContainerInspect(context.Background(), c.ContainerID) + if err != nil { + return err + } + + for port := range inspect.Config.ExposedPorts { + if port.Int() == 0 { + continue + } + c.PublicPortMapping[port.Int()] = container.Port{ + PublicPort: uint16(port.Int()), + PrivatePort: uint16(port.Int()), + Type: port.Proto(), + } + } + return nil +} diff --git a/internal/logging/accesslog/access_logger.go b/internal/logging/accesslog/access_logger.go index 93ea54b..77b28d2 100644 --- a/internal/logging/accesslog/access_logger.go +++ b/internal/logging/accesslog/access_logger.go @@ -30,9 +30,8 @@ type ( writeLock sync.Mutex closed bool - wps int64 + writeCount int64 bufSize int - lastAdjust time.Time lineBufPool *synk.BytesPool // buffer pool for formatting a single log line @@ -69,7 +68,7 @@ const ( MinBufferSize = 4 * kilobyte MaxBufferSize = 8 * megabyte - bufferAdjustInterval = time.Second // How often we check & adjust + bufferAdjustInterval = 5 * time.Second // How often we check & adjust ) const defaultRotateInterval = time.Hour @@ -297,11 +296,11 @@ func (l *AccessLogger) write(data []byte) { } else if n < len(data) { l.handleErr(gperr.Errorf("%w, writing %d bytes, only %d written", io.ErrShortWrite, len(data), n)) } - atomic.AddInt64(&l.wps, int64(n)) + atomic.AddInt64(&l.writeCount, int64(n)) } func (l *AccessLogger) adjustBuffer() { - wps := int(atomic.SwapInt64(&l.wps, 0)) + wps := int(atomic.SwapInt64(&l.writeCount, 0)) / int(bufferAdjustInterval.Seconds()) origBufSize := l.bufSize newBufSize := origBufSize diff --git a/internal/route/provider/docker.go b/internal/route/provider/docker.go index 29d8518..36c1811 100755 --- a/internal/route/provider/docker.go +++ b/internal/route/provider/docker.go @@ -75,6 +75,14 @@ func (p *DockerProvider) loadRoutesImpl() (route.Routes, gperr.Error) { continue } + if container.IsHostNetworkMode { + err := container.UpdatePorts() + if err != nil { + errs.Add(gperr.PrependSubject(container.ContainerName, err)) + continue + } + } + newEntries, err := p.routesFromContainerLabels(container) if err != nil { errs.Add(err.Subject(container.ContainerName))