resolvconf_test.go 2.1 KB

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