github.com/moby/docker@v26.1.3+incompatible/integration/image/commit_test.go (about) 1 package image // import "github.com/docker/docker/integration/image" 2 3 import ( 4 "context" 5 "strings" 6 "testing" 7 8 containertypes "github.com/docker/docker/api/types/container" 9 "github.com/docker/docker/integration/internal/container" 10 "github.com/docker/docker/testutil/daemon" 11 "gotest.tools/v3/assert" 12 is "gotest.tools/v3/assert/cmp" 13 "gotest.tools/v3/skip" 14 ) 15 16 func TestCommitInheritsEnv(t *testing.T) { 17 skip.If(t, testEnv.DaemonInfo.OSType == "windows", "FIXME") 18 ctx := setupTest(t) 19 20 client := testEnv.APIClient() 21 22 cID1 := container.Create(ctx, t, client) 23 imgName := strings.ToLower(t.Name()) 24 25 commitResp1, err := client.ContainerCommit(ctx, cID1, containertypes.CommitOptions{ 26 Changes: []string{"ENV PATH=/bin"}, 27 Reference: imgName, 28 }) 29 assert.NilError(t, err) 30 31 image1, _, err := client.ImageInspectWithRaw(ctx, commitResp1.ID) 32 assert.NilError(t, err) 33 34 expectedEnv1 := []string{"PATH=/bin"} 35 assert.Check(t, is.DeepEqual(expectedEnv1, image1.Config.Env)) 36 37 cID2 := container.Create(ctx, t, client, container.WithImage(image1.ID)) 38 39 commitResp2, err := client.ContainerCommit(ctx, cID2, containertypes.CommitOptions{ 40 Changes: []string{"ENV PATH=/usr/bin:$PATH"}, 41 Reference: imgName, 42 }) 43 assert.NilError(t, err) 44 45 image2, _, err := client.ImageInspectWithRaw(ctx, commitResp2.ID) 46 assert.NilError(t, err) 47 expectedEnv2 := []string{"PATH=/usr/bin:/bin"} 48 assert.Check(t, is.DeepEqual(expectedEnv2, image2.Config.Env)) 49 } 50 51 // Verify that files created are owned by the remapped user even after a commit 52 func TestUsernsCommit(t *testing.T) { 53 skip.If(t, testEnv.DaemonInfo.OSType != "linux") 54 skip.If(t, testEnv.IsRemoteDaemon()) 55 skip.If(t, !testEnv.IsUserNamespaceInKernel()) 56 skip.If(t, testEnv.IsRootless()) 57 58 ctx := context.Background() 59 dUserRemap := daemon.New(t, daemon.WithUserNsRemap("default")) 60 dUserRemap.StartWithBusybox(ctx, t) 61 clientUserRemap := dUserRemap.NewClientT(t) 62 defer clientUserRemap.Close() 63 64 container.Run(ctx, t, clientUserRemap, container.WithName(t.Name()), container.WithImage("busybox"), container.WithCmd("sh", "-c", "echo hello world > /hello.txt && chown 1000:1000 /hello.txt")) 65 img, err := clientUserRemap.ContainerCommit(ctx, t.Name(), containertypes.CommitOptions{}) 66 assert.NilError(t, err) 67 68 res := container.RunAttach(ctx, t, clientUserRemap, container.WithImage(img.ID), container.WithCmd("sh", "-c", "stat -c %u:%g /hello.txt")) 69 assert.Check(t, is.Equal(res.ExitCode, 0)) 70 assert.Check(t, is.Equal(res.Stderr.String(), "")) 71 assert.Assert(t, is.Equal(strings.TrimSpace(res.Stdout.String()), "1000:1000")) 72 }