diff --git a/pkg/commands/run.go b/pkg/commands/run.go index 0122f37d5..4867fd546 100644 --- a/pkg/commands/run.go +++ b/pkg/commands/run.go @@ -39,6 +39,11 @@ type RunCommand struct { cmd *instructions.RunCommand } +// for testing +var ( + userLookup = user.Lookup +) + func (r *RunCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.BuildArgs) error { var newCommand []string if r.cmd.PrependShell { @@ -133,14 +138,17 @@ func addDefaultHOME(u string, envs []string) []string { // If user is set to username, set value of HOME to /home/${user} // Otherwise the user is set to uid and HOME is / - home := fmt.Sprintf("%s=/", constants.HOME) - userObj, err := user.Lookup(u) + home := "/" + userObj, err := userLookup(u) if err == nil { - u = userObj.Username - home = fmt.Sprintf("%s=/home/%s", constants.HOME, u) + if userObj.HomeDir != "" { + home = userObj.HomeDir + } else { + home = fmt.Sprintf("/home/%s", userObj.Username) + } } - return append(envs, home) + return append(envs, fmt.Sprintf("%s=%s", constants.HOME, home)) } // String returns some information about the command for the image config diff --git a/pkg/commands/run_test.go b/pkg/commands/run_test.go index 8609ac67e..0e7c51e8c 100644 --- a/pkg/commands/run_test.go +++ b/pkg/commands/run_test.go @@ -16,6 +16,7 @@ limitations under the License. package commands import ( + "os/user" "testing" "github.com/GoogleContainerTools/kaniko/testutil" @@ -25,6 +26,7 @@ func Test_addDefaultHOME(t *testing.T) { tests := []struct { name string user string + mockUser *user.User initial []string expected []string }{ @@ -41,7 +43,7 @@ func Test_addDefaultHOME(t *testing.T) { }, }, { - name: "HOME isn't set, user isn't set", + name: "HOME not set and user not set", user: "", initial: []string{ "PATH=/something/else", @@ -52,19 +54,54 @@ func Test_addDefaultHOME(t *testing.T) { }, }, { - name: "HOME isn't set, user is set", - user: "newuser", + name: "HOME not set and user and homedir for the user set", + user: "www-add", + mockUser: &user.User{ + Username: "www-add", + HomeDir: "/home/some-other", + }, initial: []string{ "PATH=/something/else", }, expected: []string{ "PATH=/something/else", - "HOME=/", + "HOME=/home/some-other", }, }, { - name: "HOME isn't set, user is set to root", + name: "HOME not set and user set", + user: "www-add", + mockUser: &user.User{ + Username: "www-add", + }, + initial: []string{ + "PATH=/something/else", + }, + expected: []string{ + "PATH=/something/else", + "HOME=/home/www-add", + }, + }, + { + name: "HOME not set and user is set", + user: "newuser", + mockUser: &user.User{ + Username: "newuser", + }, + initial: []string{ + "PATH=/something/else", + }, + expected: []string{ + "PATH=/something/else", + "HOME=/home/newuser", + }, + }, + { + name: "HOME not set and user is set to root", user: "root", + mockUser: &user.User{ + Username: "root", + }, initial: []string{ "PATH=/something/else", }, @@ -76,6 +113,8 @@ func Test_addDefaultHOME(t *testing.T) { } for _, test := range tests { t.Run(test.name, func(t *testing.T) { + userLookup = func(username string) (*user.User, error) { return test.mockUser, nil } + defer func() { userLookup = user.Lookup }() actual := addDefaultHOME(test.user, test.initial) testutil.CheckErrorAndDeepEqual(t, false, nil, test.expected, actual) }) diff --git a/pkg/commands/user_test.go b/pkg/commands/user_test.go index 343a7bed4..12afcb02f 100644 --- a/pkg/commands/user_test.go +++ b/pkg/commands/user_test.go @@ -33,6 +33,10 @@ var userTests = []struct { user: "root", expectedUID: "root", }, + { + user: "root-add", + expectedUID: "root-add", + }, { user: "0", expectedUID: "0", diff --git a/pkg/util/fs_util.go b/pkg/util/fs_util.go index ab327c860..00562e56f 100644 --- a/pkg/util/fs_util.go +++ b/pkg/util/fs_util.go @@ -84,7 +84,7 @@ func GetFSFromImage(root string, img v1.Image) ([]string, error) { for i, l := range layers { if mediaType, err := l.MediaType(); err == nil { - logrus.Tracef("Extracting layer %d of media type %s", mediaType) + logrus.Tracef("Extracting layer %d of media type %s", i, mediaType) } else { logrus.Tracef("Extracting layer %d", i) }