pidmode_linux_test.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package container // import "github.com/docker/docker/integration/container"
  2. import (
  3. "os"
  4. "testing"
  5. containertypes "github.com/docker/docker/api/types/container"
  6. "github.com/docker/docker/errdefs"
  7. "github.com/docker/docker/integration/internal/container"
  8. "gotest.tools/v3/assert"
  9. is "gotest.tools/v3/assert/cmp"
  10. "gotest.tools/v3/skip"
  11. )
  12. func TestPIDModeHost(t *testing.T) {
  13. skip.If(t, testEnv.DaemonInfo.OSType != "linux")
  14. skip.If(t, testEnv.IsRemoteDaemon())
  15. hostPid, err := os.Readlink("/proc/1/ns/pid")
  16. assert.NilError(t, err)
  17. ctx := setupTest(t)
  18. apiClient := testEnv.APIClient()
  19. cID := container.Run(ctx, t, apiClient, container.WithPIDMode("host"))
  20. cPid := container.GetContainerNS(ctx, t, apiClient, cID, "pid")
  21. assert.Assert(t, hostPid == cPid)
  22. cID = container.Run(ctx, t, apiClient)
  23. cPid = container.GetContainerNS(ctx, t, apiClient, cID, "pid")
  24. assert.Assert(t, hostPid != cPid)
  25. }
  26. func TestPIDModeContainer(t *testing.T) {
  27. skip.If(t, testEnv.DaemonInfo.OSType != "linux")
  28. ctx := setupTest(t)
  29. apiClient := testEnv.APIClient()
  30. t.Run("non-existing container", func(t *testing.T) {
  31. _, err := container.CreateFromConfig(ctx, apiClient, container.NewTestConfig(container.WithPIDMode("container:nosuchcontainer")))
  32. assert.Check(t, is.ErrorType(err, errdefs.IsInvalidParameter))
  33. assert.Check(t, is.ErrorContains(err, "No such container: nosuchcontainer"))
  34. })
  35. t.Run("non-running container", func(t *testing.T) {
  36. const pidCtrName = "stopped-pid-namespace-container"
  37. cPIDContainerID := container.Create(ctx, t, apiClient, container.WithName(pidCtrName))
  38. ctr, err := container.CreateFromConfig(ctx, apiClient, container.NewTestConfig(container.WithPIDMode("container:"+pidCtrName)))
  39. assert.NilError(t, err, "should not produce an error when creating, only when starting")
  40. err = apiClient.ContainerStart(ctx, ctr.ID, containertypes.StartOptions{})
  41. assert.Check(t, is.ErrorType(err, errdefs.IsSystem), "should produce a System error when starting an existing container from an invalid state")
  42. assert.Check(t, is.ErrorContains(err, "failed to join PID namespace"))
  43. assert.Check(t, is.ErrorContains(err, cPIDContainerID+" is not running"))
  44. })
  45. t.Run("running container", func(t *testing.T) {
  46. const pidCtrName = "running-pid-namespace-container"
  47. container.Run(ctx, t, apiClient, container.WithName(pidCtrName))
  48. ctr, err := container.CreateFromConfig(ctx, apiClient, container.NewTestConfig(container.WithPIDMode("container:"+pidCtrName)))
  49. assert.NilError(t, err)
  50. err = apiClient.ContainerStart(ctx, ctr.ID, containertypes.StartOptions{})
  51. assert.Check(t, err)
  52. })
  53. }