github.com/tonistiigi/docker@v0.10.1-0.20240229224939-974013b0dc6a/integration/networking/resolvconf_test.go (about)

     1  package networking
     2  
     3  import (
     4  	"os"
     5  	"strings"
     6  	"testing"
     7  
     8  	containertypes "github.com/docker/docker/api/types/container"
     9  	"github.com/docker/docker/integration/internal/container"
    10  	"github.com/docker/docker/integration/internal/network"
    11  	"github.com/docker/docker/testutil/daemon"
    12  	"gotest.tools/v3/assert"
    13  	is "gotest.tools/v3/assert/cmp"
    14  	"gotest.tools/v3/skip"
    15  )
    16  
    17  // Regression test for https://github.com/moby/moby/issues/46968
    18  func TestResolvConfLocalhostIPv6(t *testing.T) {
    19  	// No "/etc/resolv.conf" on Windows.
    20  	skip.If(t, testEnv.DaemonInfo.OSType == "windows")
    21  
    22  	ctx := setupTest(t)
    23  
    24  	// Write a resolv.conf that only contains a loopback address.
    25  	// Not using t.TempDir() here because in rootless mode, while the temporary
    26  	// directory gets mode 0777, it's a subdir of an 0700 directory owned by root.
    27  	// So, it's not accessible by the daemon.
    28  	f, err := os.CreateTemp("", "resolv.conf")
    29  	assert.NilError(t, err)
    30  	defer os.Remove(f.Name())
    31  	err = f.Chmod(0644)
    32  	assert.NilError(t, err)
    33  	f.Write([]byte("nameserver 127.0.0.53\n"))
    34  
    35  	d := daemon.New(t, daemon.WithEnvVars("DOCKER_TEST_RESOLV_CONF_PATH="+f.Name()))
    36  	d.StartWithBusybox(ctx, t, "--experimental", "--ip6tables")
    37  	defer d.Stop(t)
    38  
    39  	c := d.NewClientT(t)
    40  	defer c.Close()
    41  
    42  	netName := "nnn"
    43  	network.CreateNoError(ctx, t, c, netName,
    44  		network.WithDriver("bridge"),
    45  		network.WithIPv6(),
    46  		network.WithIPAM("fd49:b5ef:36d9::/64", "fd49:b5ef:36d9::1"),
    47  	)
    48  	defer network.RemoveNoError(ctx, t, c, netName)
    49  
    50  	result := container.RunAttach(ctx, t, c,
    51  		container.WithImage("busybox:latest"),
    52  		container.WithNetworkMode(netName),
    53  		container.WithCmd("cat", "/etc/resolv.conf"),
    54  	)
    55  	defer c.ContainerRemove(ctx, result.ContainerID, containertypes.RemoveOptions{
    56  		Force: true,
    57  	})
    58  
    59  	output := strings.ReplaceAll(result.Stdout.String(), f.Name(), "RESOLV.CONF")
    60  	assert.Check(t, is.Equal(output, `# Generated by Docker Engine.
    61  # This file can be edited; Docker Engine will not make further changes once it
    62  # has been modified.
    63  
    64  nameserver 127.0.0.11
    65  options ndots:0
    66  
    67  # Based on host file: 'RESOLV.CONF' (internal resolver)
    68  # ExtServers: [host(127.0.0.53)]
    69  # Overrides: []
    70  # Option ndots from: internal
    71  `))
    72  }