github.com/tonistiigi/docker@v0.10.1-0.20240229224939-974013b0dc6a/integration/container/pidmode_linux_test.go (about)

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