func NewReaper(ctx context.Context, sessionID string, provider ReaperProvider) (*Reaper, error) {
	r := &Reaper{
		Provider:  provider,
		SessionID: sessionID,
	}
	req := ContainerRequest{
		Image:        ReaperDefaultImage,
		ExposedPorts: []string{"8080"},
		Labels: map[string]string{
			TestcontainerLabel:         "true",
			TestcontainerLabelIsReaper: "true",
		},
		SkipReaper: true,
		BindMounts: map[string]string{
			"/var/run/docker.sock": "/var/run/docker.sock",
		},
	}
	c, err := provider.RunContainer(ctx, req)
	if err != nil {
		return nil, err
	}
	endpoint, err := c.PortEndpoint(ctx, "8080", "")
	if err != nil {
		return nil, err
	}
	r.Endpoint = endpoint
	return r, nil
}
NewReaper creates a Reaper with a sessionID to identify containers and a provider to use
package testcontainers
import (
	"bufio"
	"context"
	"fmt"
	"net"
	"strings"
	"time"
	"github.com/pkg/errors"
)
const (
	TestcontainerLabel          = "org.testcontainers.golang"
	TestcontainerLabelSessionID = TestcontainerLabel + ".sessionId"
	TestcontainerLabelIsReaper  = TestcontainerLabel + ".reaper"
	ReaperDefaultImage          = "quay.io/testcontainers/ryuk:0.2.2"
)
type ReaperProvider interface {
	RunContainer(ctx context.Context, req ContainerRequest) (Container, error)
}
type Reaper struct {
	Provider  ReaperProvider
	SessionID string
	Endpoint  string
}