Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: allow overriding the bind ip address in docker containers #647

Merged
merged 10 commits into from
Sep 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 28 additions & 12 deletions testhelper/docker/resource/internal/ports.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"runtime"

"github.com/ory/dockertest/v3/docker"
"github.com/samber/lo"
)

const (
Expand All @@ -12,29 +13,44 @@ const (
)

// IPv4PortBindings returns the port bindings for the given exposed ports forcing ipv4 address.
func IPv4PortBindings(exposedPorts []string) map[docker.Port][]docker.PortBinding {
func IPv4PortBindings(exposedPorts []string, opts ...IPv4PortBindingsOpt) map[docker.Port][]docker.PortBinding {
portBindings := make(map[docker.Port][]docker.PortBinding)

bindings := []docker.PortBinding{
{
HostIP: BindHostIP,
HostPort: "0",
},
c := &ipv4PortBindingsConfig{
ips: []string{BindHostIP},
}
if runtime.GOOS == "linux" {
bindings = append(bindings, docker.PortBinding{
HostIP: BindInternalHost,
HostPort: "0",
})
c.ips = append(c.ips, BindInternalHost)
}

for _, opt := range opts {
opt(c)
}
bindings := lo.Map(c.ips, func(ip string, _ int) docker.PortBinding {
return docker.PortBinding{
HostIP: ip,
HostPort: "0",
}
})
for _, exposedPort := range exposedPorts {
portBindings[docker.Port(exposedPort)+"/tcp"] = bindings
}

return portBindings
}

type IPv4PortBindingsOpt func(*ipv4PortBindingsConfig)

type ipv4PortBindingsConfig struct {
ips []string
}

func WithBindIP(ip string) IPv4PortBindingsOpt {
return func(c *ipv4PortBindingsConfig) {
if ip != "" {
c.ips = []string{ip}
}
}
}

func DefaultHostConfig(hc *docker.HostConfig) {
hc.PublishAllPorts = false
}
7 changes: 7 additions & 0 deletions testhelper/docker/resource/minio/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,15 @@ func WithOptions(options ...string) Opt {
}
}

func WithBindIP(ip string) Opt {
return func(c *Config) {
c.BindIP = ip
}
}

type Config struct {
Tag string
Network *docker.Network
Options []string
BindIP string
}
4 changes: 2 additions & 2 deletions testhelper/docker/resource/minio/minio.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ func Setup(pool *dockertest.Pool, d resource.Cleaner, opts ...func(*Config)) (*R
fmt.Sprintf("MINIO_SITE_REGION=%s", region),
"MINIO_API_SELECT_PARQUET=on",
}, c.Options...),
PortBindings: internal.IPv4PortBindings([]string{"9000"}),
PortBindings: internal.IPv4PortBindings([]string{"9000"}, internal.WithBindIP(c.BindIP)),
}, internal.DefaultHostConfig)
if err != nil {
return nil, fmt.Errorf("could not start resource: %s", err)
Expand All @@ -82,7 +82,7 @@ func Setup(pool *dockertest.Pool, d resource.Cleaner, opts ...func(*Config)) (*R
}
})

endpoint := fmt.Sprintf("localhost:%s", minioContainer.GetPort("9000/tcp"))
endpoint := minioContainer.GetHostPort("9000/tcp")

// check if minio server is up & running.
if err := pool.Retry(func() error {
Expand Down
2 changes: 1 addition & 1 deletion testhelper/docker/resource/sshserver/sshserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ func Setup(pool *dockertest.Pool, cln resource.Cleaner, opts ...Option) (*Resour

var (
buf *bytes.Buffer
timeout = time.After(30 * time.Second)
timeout = time.After(60 * time.Second)
ticker = time.NewTicker(200 * time.Millisecond)
)
loop:
Expand Down
Loading