package container // import "github.com/docker/docker/integration/container" import ( "os" "testing" containertypes "github.com/docker/docker/api/types/container" "github.com/docker/docker/errdefs" "github.com/docker/docker/integration/internal/container" "gotest.tools/v3/assert" is "gotest.tools/v3/assert/cmp" "gotest.tools/v3/skip" ) func TestPIDModeHost(t *testing.T) { skip.If(t, testEnv.DaemonInfo.OSType != "linux") skip.If(t, testEnv.IsRemoteDaemon()) hostPid, err := os.Readlink("/proc/1/ns/pid") assert.NilError(t, err) ctx := setupTest(t) apiClient := testEnv.APIClient() cID := container.Run(ctx, t, apiClient, container.WithPIDMode("host")) cPid := container.GetContainerNS(ctx, t, apiClient, cID, "pid") assert.Assert(t, hostPid == cPid) cID = container.Run(ctx, t, apiClient) cPid = container.GetContainerNS(ctx, t, apiClient, cID, "pid") assert.Assert(t, hostPid != cPid) } func TestPIDModeContainer(t *testing.T) { skip.If(t, testEnv.DaemonInfo.OSType != "linux") ctx := setupTest(t) apiClient := testEnv.APIClient() t.Run("non-existing container", func(t *testing.T) { _, err := container.CreateFromConfig(ctx, apiClient, container.NewTestConfig(container.WithPIDMode("container:nosuchcontainer"))) assert.Check(t, is.ErrorType(err, errdefs.IsInvalidParameter)) assert.Check(t, is.ErrorContains(err, "No such container: nosuchcontainer")) }) t.Run("non-running container", func(t *testing.T) { const pidCtrName = "stopped-pid-namespace-container" cPIDContainerID := container.Create(ctx, t, apiClient, container.WithName(pidCtrName)) ctr, err := container.CreateFromConfig(ctx, apiClient, container.NewTestConfig(container.WithPIDMode("container:"+pidCtrName))) assert.NilError(t, err, "should not produce an error when creating, only when starting") err = apiClient.ContainerStart(ctx, ctr.ID, containertypes.StartOptions{}) assert.Check(t, is.ErrorType(err, errdefs.IsSystem), "should produce a System error when starting an existing container from an invalid state") assert.Check(t, is.ErrorContains(err, "failed to join PID namespace")) assert.Check(t, is.ErrorContains(err, cPIDContainerID+" is not running")) }) t.Run("running container", func(t *testing.T) { const pidCtrName = "running-pid-namespace-container" container.Run(ctx, t, apiClient, container.WithName(pidCtrName)) ctr, err := container.CreateFromConfig(ctx, apiClient, container.NewTestConfig(container.WithPIDMode("container:"+pidCtrName))) assert.NilError(t, err) err = apiClient.ContainerStart(ctx, ctr.ID, containertypes.StartOptions{}) assert.Check(t, err) }) }