pidmode_linux_test.go 2.8 KB

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