diff --git a/container.go b/container.go index 01f38f4534..5f0684640a 100644 --- a/container.go +++ b/container.go @@ -55,7 +55,8 @@ type Container interface { Networks(context.Context) ([]string, error) // get container networks NetworkAliases(context.Context) (map[string][]string, error) // get container network aliases for a network Exec(ctx context.Context, cmd []string) (int, io.Reader, error) - ContainerIP(context.Context) (string, error) // get container ip + ContainerIP(context.Context) (string, error) // get container ip + ContainerIPs(context.Context) ([]string, error) // get all container IPs CopyToContainer(ctx context.Context, fileContent []byte, containerFilePath string, fileMode int64) error CopyDirToContainer(ctx context.Context, hostDirPath string, containerParentPath string, fileMode int64) error CopyFileToContainer(ctx context.Context, hostFilePath string, containerFilePath string, fileMode int64) error diff --git a/docker.go b/docker.go index f8ab69ebb0..f08b3c2ec2 100644 --- a/docker.go +++ b/docker.go @@ -396,6 +396,23 @@ func (c *DockerContainer) ContainerIP(ctx context.Context) (string, error) { return ip, nil } +// ContainerIPs gets the IP addresses of all the networks within the container. +func (c *DockerContainer) ContainerIPs(ctx context.Context) ([]string, error) { + ips := make([]string, 0) + + inspect, err := c.inspectContainer(ctx) + if err != nil { + return nil, err + } + + networks := inspect.NetworkSettings.Networks + for _, nw := range networks { + ips = append(ips, nw.IPAddress) + } + + return ips, nil +} + // NetworkAliases gets the aliases of the container for the networks it is attached to. func (c *DockerContainer) NetworkAliases(ctx context.Context) (map[string][]string, error) { inspect, err := c.inspectContainer(ctx) diff --git a/docker_test.go b/docker_test.go index 723566541b..233d19d206 100644 --- a/docker_test.go +++ b/docker_test.go @@ -741,6 +741,54 @@ func TestContainerCreation(t *testing.T) { } } +func TestContainerIPs(t *testing.T) { + ctx := context.Background() + + networkName := "new-network" + newNetwork, err := GenericNetwork(ctx, GenericNetworkRequest{ + ProviderType: providerType, + NetworkRequest: NetworkRequest{ + Name: networkName, + CheckDuplicate: true, + }, + }) + if err != nil { + t.Fatal(err) + } + + t.Cleanup(func() { + require.NoError(t, newNetwork.Remove(ctx)) + }) + + nginxC, err := GenericContainer(ctx, GenericContainerRequest{ + ProviderType: providerType, + ContainerRequest: ContainerRequest{ + Image: nginxAlpineImage, + ExposedPorts: []string{ + nginxDefaultPort, + }, + Networks: []string{ + "bridge", + networkName, + }, + WaitingFor: wait.ForListeningPort(nginxDefaultPort), + }, + Started: true, + }) + + require.NoError(t, err) + terminateContainerOnEnd(t, ctx, nginxC) + + ips, err := nginxC.ContainerIPs(ctx) + if err != nil { + t.Fatal(err) + } + + if len(ips) != 2 { + t.Errorf("Expected two IP addresses, got %v", len(ips)) + } +} + func TestContainerCreationWithName(t *testing.T) { ctx := context.Background()