diff --git a/pkg/container/client.go b/pkg/container/client.go index 052d1a256..e62923f7b 100644 --- a/pkg/container/client.go +++ b/pkg/container/client.go @@ -208,11 +208,25 @@ func (client dockerClient) StopContainer(c t.Container, timeout time.Duration) e return nil } +func (client dockerClient) GetNetworkConfig(c t.Container) *network.NetworkingConfig { + config := &network.NetworkingConfig{ + EndpointsConfig: c.ContainerInfo().NetworkSettings.Networks, + } + + for _, ep := range config.EndpointsConfig { + // This keeps accumulating across upgrades with no apparent added value + // so throwing the information away to prevent overflows. + ep.Aliases = nil + } + return config +} + func (client dockerClient) StartContainer(c t.Container) (t.ContainerID, error) { bg := context.Background() config := c.GetCreateConfig() hostConfig := c.GetCreateHostConfig() - networkConfig := &network.NetworkingConfig{EndpointsConfig: c.ContainerInfo().NetworkSettings.Networks} + networkConfig := client.GetNetworkConfig(c) + // simpleNetworkConfig is a networkConfig with only 1 network. // see: https://github.com/docker/docker/issues/29265 simpleNetworkConfig := func() *network.NetworkingConfig { @@ -228,6 +242,7 @@ func (client dockerClient) StartContainer(c t.Container) (t.ContainerID, error) name := c.Name() log.Infof("Creating %s", name) + createdContainer, err := client.api.ContainerCreate(bg, config, hostConfig, simpleNetworkConfig, nil, name) if err != nil { return "", err diff --git a/pkg/container/client_test.go b/pkg/container/client_test.go index 24c32225e..6600123f6 100644 --- a/pkg/container/client_test.go +++ b/pkg/container/client_test.go @@ -1,6 +1,7 @@ package container import ( + "github.com/docker/docker/api/types/network" "time" "github.com/containrrr/watchtower/internal/util" @@ -284,6 +285,24 @@ var _ = Describe("the client", func() { }) }) }) + Describe(`GetNetworkConfig`, func() { + When(`providing a container with network aliases`, func() { + It(`should purge the aliases`, func() { + aliases := []string{"One", "Two"} + client := dockerClient{ + api: docker, + ClientOptions: ClientOptions{PullImages: false, IncludeRestarting: false}, + } + container := MockContainer(WithImageName("docker.io/prefix/imagename:latest")) + endpoints := map[string]*network.EndpointSettings{ + `test`: {Aliases: aliases}, + } + container.containerInfo.NetworkSettings = &types.NetworkSettings{Networks: endpoints} + Expect(container.ContainerInfo().NetworkSettings.Networks[`test`].Aliases).To(Equal(aliases)) + Expect(client.GetNetworkConfig(container).EndpointsConfig[`test`].Aliases).To(BeEmpty()) + }) + }) + }) }) // Capture logrus output in buffer