Set default home value (#281)
* Set default home value * Apply default home value based on user for run commands * rename default home function
This commit is contained in:
parent
52e9863810
commit
4e77fa000d
|
|
@ -21,3 +21,6 @@ RUN rm /etc/baz
|
||||||
# Test with ARG
|
# Test with ARG
|
||||||
ARG file
|
ARG file
|
||||||
RUN echo "run" > $file
|
RUN echo "run" > $file
|
||||||
|
|
||||||
|
RUN echo "test home" > $HOME/file
|
||||||
|
COPY context/foo $HOME/foo
|
||||||
|
|
|
||||||
|
|
@ -18,4 +18,10 @@ RUN groupadd testgroup
|
||||||
USER testuser:testgroup
|
USER testuser:testgroup
|
||||||
RUN echo "hey" > /tmp/foo
|
RUN echo "hey" > /tmp/foo
|
||||||
USER testuser:1001
|
USER testuser:1001
|
||||||
RUN echo "hey2" >> /tmp/foo
|
RUN echo "hey2" >> /tmp/foo
|
||||||
|
|
||||||
|
RUN useradd -ms /bin/bash newuser
|
||||||
|
USER newuser
|
||||||
|
RUN echo "hi" > $HOME/file
|
||||||
|
COPY context/foo $HOME/foo
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,12 +17,14 @@ limitations under the License.
|
||||||
package commands
|
package commands
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
|
"github.com/GoogleContainerTools/kaniko/pkg/constants"
|
||||||
"github.com/GoogleContainerTools/kaniko/pkg/dockerfile"
|
"github.com/GoogleContainerTools/kaniko/pkg/dockerfile"
|
||||||
"github.com/GoogleContainerTools/kaniko/pkg/util"
|
"github.com/GoogleContainerTools/kaniko/pkg/util"
|
||||||
"github.com/google/go-containerregistry/pkg/v1"
|
"github.com/google/go-containerregistry/pkg/v1"
|
||||||
|
|
@ -59,7 +61,7 @@ func (r *RunCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.Bui
|
||||||
cmd.Stdout = os.Stdout
|
cmd.Stdout = os.Stdout
|
||||||
cmd.Stderr = os.Stderr
|
cmd.Stderr = os.Stderr
|
||||||
replacementEnvs := buildArgs.ReplacementEnvs(config.Env)
|
replacementEnvs := buildArgs.ReplacementEnvs(config.Env)
|
||||||
cmd.Env = replacementEnvs
|
cmd.Env = addDefaultHOME(config.User, replacementEnvs)
|
||||||
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
|
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
|
||||||
|
|
||||||
// If specified, run the command as a specific user
|
// If specified, run the command as a specific user
|
||||||
|
|
@ -113,6 +115,22 @@ func (r *RunCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.Bui
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// addDefaultHOME adds the default value for HOME if it isn't already set
|
||||||
|
func addDefaultHOME(user string, envs []string) []string {
|
||||||
|
for _, env := range envs {
|
||||||
|
split := strings.SplitN(env, "=", 2)
|
||||||
|
if split[0] == constants.HOME {
|
||||||
|
return envs
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If user isn't set, set default value of HOME
|
||||||
|
if user == "" {
|
||||||
|
return append(envs, fmt.Sprintf("%s=%s", constants.HOME, constants.DefaultHOMEValue))
|
||||||
|
}
|
||||||
|
// If user is set, set value of HOME to /home/${user}
|
||||||
|
return append(envs, fmt.Sprintf("%s=/home/%s", constants.HOME, user))
|
||||||
|
}
|
||||||
|
|
||||||
// FilesToSnapshot returns nil for this command because we don't know which files
|
// FilesToSnapshot returns nil for this command because we don't know which files
|
||||||
// have changed, so we snapshot the entire system.
|
// have changed, so we snapshot the entire system.
|
||||||
func (r *RunCommand) FilesToSnapshot() []string {
|
func (r *RunCommand) FilesToSnapshot() []string {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
/*
|
||||||
|
Copyright 2018 Google LLC
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
package commands
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/GoogleContainerTools/kaniko/testutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test_addDefaultHOME(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
user string
|
||||||
|
initial []string
|
||||||
|
expected []string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "HOME already set",
|
||||||
|
user: "",
|
||||||
|
initial: []string{
|
||||||
|
"HOME=/something",
|
||||||
|
"PATH=/something/else",
|
||||||
|
},
|
||||||
|
expected: []string{
|
||||||
|
"HOME=/something",
|
||||||
|
"PATH=/something/else",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "HOME isn't set, user isn't set",
|
||||||
|
user: "",
|
||||||
|
initial: []string{
|
||||||
|
"PATH=/something/else",
|
||||||
|
},
|
||||||
|
expected: []string{
|
||||||
|
"PATH=/something/else",
|
||||||
|
"HOME=/root",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "HOME isn't set, user is set",
|
||||||
|
user: "newuser",
|
||||||
|
initial: []string{
|
||||||
|
"PATH=/something/else",
|
||||||
|
},
|
||||||
|
expected: []string{
|
||||||
|
"PATH=/something/else",
|
||||||
|
"HOME=/home/newuser",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, test := range tests {
|
||||||
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
actual := addDefaultHOME(test.user, test.initial)
|
||||||
|
testutil.CheckErrorAndDeepEqual(t, false, nil, test.expected, actual)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -54,6 +54,10 @@ const (
|
||||||
GCSBuildContextPrefix = "gs://"
|
GCSBuildContextPrefix = "gs://"
|
||||||
S3BuildContextPrefix = "s3://"
|
S3BuildContextPrefix = "s3://"
|
||||||
LocalDirBuildContextPrefix = "dir://"
|
LocalDirBuildContextPrefix = "dir://"
|
||||||
|
|
||||||
|
// DefaultHOMEValue is the default value Docker sets for $HOME
|
||||||
|
HOME = "HOME"
|
||||||
|
DefaultHOMEValue = "/root"
|
||||||
)
|
)
|
||||||
|
|
||||||
// KanikoBuildFiles is the list of files required to build kaniko
|
// KanikoBuildFiles is the list of files required to build kaniko
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,6 @@ import (
|
||||||
"github.com/google/go-containerregistry/pkg/authn/k8schain"
|
"github.com/google/go-containerregistry/pkg/authn/k8schain"
|
||||||
"github.com/google/go-containerregistry/pkg/name"
|
"github.com/google/go-containerregistry/pkg/name"
|
||||||
"github.com/google/go-containerregistry/pkg/v1"
|
"github.com/google/go-containerregistry/pkg/v1"
|
||||||
"github.com/google/go-containerregistry/pkg/v1/empty"
|
|
||||||
"github.com/google/go-containerregistry/pkg/v1/mutate"
|
"github.com/google/go-containerregistry/pkg/v1/mutate"
|
||||||
"github.com/google/go-containerregistry/pkg/v1/remote"
|
"github.com/google/go-containerregistry/pkg/v1/remote"
|
||||||
"github.com/google/go-containerregistry/pkg/v1/tarball"
|
"github.com/google/go-containerregistry/pkg/v1/tarball"
|
||||||
|
|
@ -83,10 +82,7 @@ func DoBuild(k KanikoBuildArgs) (v1.Image, error) {
|
||||||
if err := snapshotter.Init(); err != nil {
|
if err := snapshotter.Init(); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
imageConfig, err := sourceImage.ConfigFile()
|
imageConfig, err := util.RetrieveConfigFile(sourceImage)
|
||||||
if sourceImage == empty.Image {
|
|
||||||
imageConfig.Config.Env = constants.ScratchEnvVars
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,18 @@ func RetrieveSourceImage(index int, buildArgs []string, stages []instructions.St
|
||||||
return retrieveRemoteImage(currentBaseName)
|
return retrieveRemoteImage(currentBaseName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RetrieveConfigFile returns the config file for an image
|
||||||
|
func RetrieveConfigFile(sourceImage v1.Image) (*v1.ConfigFile, error) {
|
||||||
|
imageConfig, err := sourceImage.ConfigFile()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if sourceImage == empty.Image {
|
||||||
|
imageConfig.Config.Env = constants.ScratchEnvVars
|
||||||
|
}
|
||||||
|
return imageConfig, nil
|
||||||
|
}
|
||||||
|
|
||||||
func tarballImage(index int) (v1.Image, error) {
|
func tarballImage(index int) (v1.Image, error) {
|
||||||
tarPath := filepath.Join(constants.KanikoIntermediateStagesDir, strconv.Itoa(index))
|
tarPath := filepath.Join(constants.KanikoIntermediateStagesDir, strconv.Itoa(index))
|
||||||
logrus.Infof("Base image from previous stage %d found, using saved tar at path %s", index, tarPath)
|
logrus.Infof("Base image from previous stage %d found, using saved tar at path %s", index, tarPath)
|
||||||
|
|
|
||||||
|
|
@ -18,12 +18,13 @@ package util
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"testing"
|
||||||
|
|
||||||
"github.com/GoogleContainerTools/kaniko/testutil"
|
"github.com/GoogleContainerTools/kaniko/testutil"
|
||||||
"github.com/google/go-containerregistry/pkg/v1"
|
"github.com/google/go-containerregistry/pkg/v1"
|
||||||
"github.com/google/go-containerregistry/pkg/v1/empty"
|
"github.com/google/go-containerregistry/pkg/v1/empty"
|
||||||
"github.com/moby/buildkit/frontend/dockerfile/instructions"
|
"github.com/moby/buildkit/frontend/dockerfile/instructions"
|
||||||
"github.com/moby/buildkit/frontend/dockerfile/parser"
|
"github.com/moby/buildkit/frontend/dockerfile/parser"
|
||||||
"testing"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue