Skip to content

Commit

Permalink
container/SetupWorkingDirectory: Don't mutate config
Browse files Browse the repository at this point in the history
Don't mutate the container's `Config.WorkingDir` permanently with a
cleaned path when creating a working directory.

Move the `filepath.Clean` to the `translateWorkingDir` instead.

Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
  • Loading branch information
vvoland committed Apr 18, 2024
1 parent 1cff5d6 commit 217d538
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 3 deletions.
4 changes: 2 additions & 2 deletions container/container.go
Original file line number Diff line number Diff line change
Expand Up @@ -299,8 +299,8 @@ func (container *Container) SetupWorkingDirectory(rootIdentity idtools.Identity)
return nil
}

container.Config.WorkingDir = filepath.Clean(container.Config.WorkingDir)
pth, err := container.GetResourcePath(container.Config.WorkingDir)
workdir := filepath.Clean(container.Config.WorkingDir)
pth, err := container.GetResourcePath(workdir)
if err != nil {
return err
}
Expand Down
2 changes: 1 addition & 1 deletion daemon/container.go
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,6 @@ func translateWorkingDir(config *containertypes.Config) error {
if !system.IsAbs(wd) {
return fmt.Errorf("the working directory '%s' is invalid, it needs to be an absolute path", config.WorkingDir)
}
config.WorkingDir = wd
config.WorkingDir = filepath.Clean(wd)
return nil
}
65 changes: 65 additions & 0 deletions integration/build/build_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -689,6 +689,71 @@ func TestBuildPlatformInvalid(t *testing.T) {
assert.Check(t, is.ErrorType(err, errdefs.IsInvalidParameter))
}

// Test for #47627
func TestBuildWorkdirNoCacheMiss(t *testing.T) {
ctx := setupTest(t)

for _, tc := range []struct {
name string
dockerfile string
}{
{name: "trailing slash", dockerfile: "FROM busybox\nWORKDIR /foo/"},
{name: "no trailing slash", dockerfile: "FROM busybox\nWORKDIR /foo"},
} {
dockerfile := tc.dockerfile
t.Run(tc.name, func(t *testing.T) {
source := fakecontext.New(t, "", fakecontext.WithDockerfile(dockerfile))
defer source.Close()

apiClient := testEnv.APIClient()

buildAndGetID := func() string {
resp, err := apiClient.ImageBuild(ctx, source.AsTarReader(t), types.ImageBuildOptions{
Version: types.BuilderV1,
})
assert.NilError(t, err)
defer resp.Body.Close()

id := readBuildImageIDs(t, resp.Body)
assert.Check(t, id != "")
return id
}

firstId := buildAndGetID()
secondId := buildAndGetID()

assert.Check(t, is.Equal(firstId, secondId), "expected cache to be used")
})
}
}

func readBuildImageIDs(t *testing.T, rd io.Reader) string {
decoder := json.NewDecoder(rd)
for {
var jm jsonmessage.JSONMessage
if err := decoder.Decode(&jm); err != nil {
if err == io.EOF {
break
}
assert.NilError(t, err)
}

if jm.Aux == nil {
continue
}

var auxId struct {
ID string `json:"ID"`
}

if json.Unmarshal(*jm.Aux, &auxId); auxId.ID != "" {
return auxId.ID
}
}

return ""
}

func writeTarRecord(t *testing.T, w *tar.Writer, fn, contents string) {
err := w.WriteHeader(&tar.Header{
Name: fn,
Expand Down
30 changes: 30 additions & 0 deletions integration/container/run_linux_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -326,3 +326,33 @@ func TestStaticIPOutsideSubpool(t *testing.T) {

assert.Check(t, is.Contains(b.String(), "inet 10.42.1.3/16"))
}

func TestWorkingDirNormalization(t *testing.T) {
ctx := setupTest(t)
apiClient := testEnv.APIClient()

for _, tc := range []struct {
name string
workdir string
}{
{name: "trailing slash", workdir: "/tmp/"},
{name: "no trailing slash", workdir: "/tmp"},
} {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()

cID := container.Run(ctx, t, apiClient,
container.WithImage("busybox"),
container.WithWorkingDir(tc.workdir),
)

defer container.Remove(ctx, t, apiClient, cID, containertypes.RemoveOptions{Force: true})

inspect := container.Inspect(ctx, t, apiClient, cID)

assert.Check(t, is.Equal(inspect.Config.WorkingDir, "/tmp"))
})

}
}

0 comments on commit 217d538

Please sign in to comment.