run_linux_test.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package container // import "github.com/docker/docker/integration/container"
  2. import (
  3. "context"
  4. "strings"
  5. "testing"
  6. "time"
  7. containertypes "github.com/docker/docker/api/types/container"
  8. "github.com/docker/docker/api/types/versions"
  9. "github.com/docker/docker/integration/internal/container"
  10. net "github.com/docker/docker/integration/internal/network"
  11. "gotest.tools/v3/assert"
  12. is "gotest.tools/v3/assert/cmp"
  13. "gotest.tools/v3/poll"
  14. "gotest.tools/v3/skip"
  15. )
  16. func TestNISDomainname(t *testing.T) {
  17. // Older versions of the daemon would concatenate hostname and domainname,
  18. // so hostname "foobar" and domainname "baz.cyphar.com" would produce
  19. // `foobar.baz.cyphar.com` as hostname.
  20. skip.If(t, versions.LessThan(testEnv.DaemonAPIVersion(), "1.40"), "skip test from new feature")
  21. skip.If(t, testEnv.DaemonInfo.OSType != "linux")
  22. // Rootless supports custom Hostname but doesn't support custom Domainname
  23. // OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \
  24. // "write sysctl key kernel.domainname: open /proc/sys/kernel/domainname: permission denied\"": unknown.
  25. skip.If(t, testEnv.IsRootless, "rootless mode doesn't support setting Domainname (TODO: https://github.com/moby/moby/issues/40632)")
  26. defer setupTest(t)()
  27. client := testEnv.APIClient()
  28. ctx := context.Background()
  29. const (
  30. hostname = "foobar"
  31. domainname = "baz.cyphar.com"
  32. )
  33. cID := container.Run(ctx, t, client, func(c *container.TestContainerConfig) {
  34. c.Config.Hostname = hostname
  35. c.Config.Domainname = domainname
  36. })
  37. poll.WaitOn(t, container.IsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
  38. inspect, err := client.ContainerInspect(ctx, cID)
  39. assert.NilError(t, err)
  40. assert.Check(t, is.Equal(hostname, inspect.Config.Hostname))
  41. assert.Check(t, is.Equal(domainname, inspect.Config.Domainname))
  42. // Check hostname.
  43. res, err := container.Exec(ctx, client, cID,
  44. []string{"cat", "/proc/sys/kernel/hostname"})
  45. assert.NilError(t, err)
  46. assert.Assert(t, is.Len(res.Stderr(), 0))
  47. assert.Equal(t, 0, res.ExitCode)
  48. assert.Check(t, is.Equal(hostname, strings.TrimSpace(res.Stdout())))
  49. // Check domainname.
  50. res, err = container.Exec(ctx, client, cID,
  51. []string{"cat", "/proc/sys/kernel/domainname"})
  52. assert.NilError(t, err)
  53. assert.Assert(t, is.Len(res.Stderr(), 0))
  54. assert.Equal(t, 0, res.ExitCode)
  55. assert.Check(t, is.Equal(domainname, strings.TrimSpace(res.Stdout())))
  56. }
  57. func TestHostnameDnsResolution(t *testing.T) {
  58. skip.If(t, testEnv.DaemonInfo.OSType != "linux")
  59. defer setupTest(t)()
  60. client := testEnv.APIClient()
  61. ctx := context.Background()
  62. const (
  63. hostname = "foobar"
  64. )
  65. // using user defined network as we want to use internal DNS
  66. netName := "foobar-net"
  67. net.CreateNoError(context.Background(), t, client, netName, net.WithDriver("bridge"))
  68. cID := container.Run(ctx, t, client, func(c *container.TestContainerConfig) {
  69. c.Config.Hostname = hostname
  70. c.HostConfig.NetworkMode = containertypes.NetworkMode(netName)
  71. })
  72. poll.WaitOn(t, container.IsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
  73. inspect, err := client.ContainerInspect(ctx, cID)
  74. assert.NilError(t, err)
  75. assert.Check(t, is.Equal(hostname, inspect.Config.Hostname))
  76. // Clear hosts file so ping will use DNS for hostname resolution
  77. res, err := container.Exec(ctx, client, cID,
  78. []string{"sh", "-c", "echo 127.0.0.1 localhost | tee /etc/hosts && ping -c 1 foobar"})
  79. assert.NilError(t, err)
  80. assert.Check(t, is.Equal("", res.Stderr()))
  81. assert.Equal(t, 0, res.ExitCode)
  82. }
  83. func TestUnprivilegedPortsAndPing(t *testing.T) {
  84. skip.If(t, testEnv.DaemonInfo.OSType != "linux")
  85. skip.If(t, testEnv.IsRootless, "rootless mode doesn't support setting net.ipv4.ping_group_range and net.ipv4.ip_unprivileged_port_start")
  86. defer setupTest(t)()
  87. client := testEnv.APIClient()
  88. ctx := context.Background()
  89. cID := container.Run(ctx, t, client, func(c *container.TestContainerConfig) {
  90. c.Config.User = "1000:1000"
  91. })
  92. poll.WaitOn(t, container.IsInState(ctx, client, cID, "running"), poll.WithDelay(100*time.Millisecond))
  93. // Check net.ipv4.ping_group_range.
  94. res, err := container.Exec(ctx, client, cID, []string{"cat", "/proc/sys/net/ipv4/ping_group_range"})
  95. assert.NilError(t, err)
  96. assert.Assert(t, is.Len(res.Stderr(), 0))
  97. assert.Equal(t, 0, res.ExitCode)
  98. assert.Equal(t, `0 2147483647`, strings.TrimSpace(res.Stdout()))
  99. // Check net.ipv4.ip_unprivileged_port_start.
  100. res, err = container.Exec(ctx, client, cID, []string{"cat", "/proc/sys/net/ipv4/ip_unprivileged_port_start"})
  101. assert.NilError(t, err)
  102. assert.Assert(t, is.Len(res.Stderr(), 0))
  103. assert.Equal(t, 0, res.ExitCode)
  104. assert.Equal(t, "0", strings.TrimSpace(res.Stdout()))
  105. }