diff --git a/docker.go b/docker.go index fe1952c839..bb099dbe4c 100644 --- a/docker.go +++ b/docker.go @@ -745,6 +745,12 @@ func NewDockerClient() (cli *client.Client, host string, tcConfig TestContainers host = "unix:///var/run/docker.sock" } + opts = append(opts, client.WithHTTPHeaders( + map[string]string{ + "x-tc-sid": sessionID().String(), + }), + ) + cli, err = client.NewClientWithOpts(opts...) if err != nil { @@ -934,7 +940,7 @@ func (p *DockerProvider) CreateContainer(ctx context.Context, req ContainerReque req.Labels = make(map[string]string) } - sessionID := uuid.New() + sessionID := sessionID() var termSignal chan bool if !req.SkipReaper { @@ -1155,7 +1161,7 @@ func (p *DockerProvider) ReuseOrCreateContainer(ctx context.Context, req Contain return p.CreateContainer(ctx, req) } - sessionID := uuid.New() + sessionID := sessionID() var termSignal chan bool if !req.SkipReaper { r, err := NewReaper(ctx, sessionID.String(), p, req.ReaperImage) @@ -1310,10 +1316,9 @@ func (p *DockerProvider) CreateNetwork(ctx context.Context, req NetworkRequest) IPAM: req.IPAM, } - sessionID := uuid.New() - var termSignal chan bool if !req.SkipReaper { + sessionID := sessionID() r, err := NewReaper(context.WithValue(ctx, dockerHostContextKey, p.host), sessionID.String(), p, req.ReaperImage) if err != nil { return nil, fmt.Errorf("%w: creating network reaper failed", err) diff --git a/reaper.go b/reaper.go index a969960d53..5a81336597 100644 --- a/reaper.go +++ b/reaper.go @@ -63,7 +63,6 @@ func NewReaper(ctx context.Context, sessionID string, provider ReaperProvider, r ExposedPorts: []string{string(listeningPort)}, NetworkMode: Bridge, Labels: map[string]string{ - TestcontainerLabel: "true", TestcontainerLabelIsReaper: "true", }, SkipReaper: true, @@ -72,6 +71,11 @@ func NewReaper(ctx context.Context, sessionID string, provider ReaperProvider, r WaitingFor: wait.ForListeningPort(listeningPort), } + // include reaper-specific labels to the reaper container + for k, v := range reaper.Labels() { + req.Labels[k] = v + } + tcConfig := provider.Config() req.Privileged = tcConfig.RyukPrivileged diff --git a/reaper_test.go b/reaper_test.go index 161646f04a..a32b876626 100644 --- a/reaper_test.go +++ b/reaper_test.go @@ -35,8 +35,9 @@ func createContainerRequest(customize func(ContainerRequest) ContainerRequest) C Image: "reaperImage", ExposedPorts: []string{"8080/tcp"}, Labels: map[string]string{ - TestcontainerLabel: "true", - TestcontainerLabelIsReaper: "true", + TestcontainerLabel: "true", + TestcontainerLabelIsReaper: "true", + TestcontainerLabelSessionID: "sessionId", }, SkipReaper: true, Mounts: Mounts(BindMount("/var/run/docker.sock", "/var/run/docker.sock")), diff --git a/session.go b/session.go new file mode 100644 index 0000000000..e736209790 --- /dev/null +++ b/session.go @@ -0,0 +1,18 @@ +package testcontainers + +import ( + "sync" + + "github.com/google/uuid" +) + +var tcSessionID uuid.UUID +var tcSessionIDOnce sync.Once + +func sessionID() uuid.UUID { + tcSessionIDOnce.Do(func() { + tcSessionID = uuid.New() + }) + + return tcSessionID +}