Merge pull request #348 from priyawadhwa/entrypoint
Review config for cmd/entrypoint after building a stage
This commit is contained in:
commit
1a13c81be8
|
|
@ -0,0 +1,5 @@
|
||||||
|
FROM gcr.io/distroless/base@sha256:628939ac8bf3f49571d05c6c76b8688cb4a851af6c7088e599388259875bde20 AS first
|
||||||
|
CMD ["mycmd"]
|
||||||
|
|
||||||
|
FROM first
|
||||||
|
ENTRYPOINT ["myentrypoint"] # This should clear out CMD in the config metadata
|
||||||
|
|
@ -23,7 +23,6 @@ import (
|
||||||
|
|
||||||
"github.com/google/go-containerregistry/pkg/v1"
|
"github.com/google/go-containerregistry/pkg/v1"
|
||||||
"github.com/moby/buildkit/frontend/dockerfile/instructions"
|
"github.com/moby/buildkit/frontend/dockerfile/instructions"
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type CmdCommand struct {
|
type CmdCommand struct {
|
||||||
|
|
@ -48,7 +47,6 @@ func (c *CmdCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.Bui
|
||||||
newCommand = c.cmd.CmdLine
|
newCommand = c.cmd.CmdLine
|
||||||
}
|
}
|
||||||
|
|
||||||
logrus.Infof("Replacing CMD in config with %v", newCommand)
|
|
||||||
config.Cmd = newCommand
|
config.Cmd = newCommand
|
||||||
config.ArgsEscaped = true
|
config.ArgsEscaped = true
|
||||||
return nil
|
return nil
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,6 @@ import (
|
||||||
|
|
||||||
"github.com/google/go-containerregistry/pkg/v1"
|
"github.com/google/go-containerregistry/pkg/v1"
|
||||||
"github.com/moby/buildkit/frontend/dockerfile/instructions"
|
"github.com/moby/buildkit/frontend/dockerfile/instructions"
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type EntrypointCommand struct {
|
type EntrypointCommand struct {
|
||||||
|
|
@ -47,7 +46,6 @@ func (e *EntrypointCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerf
|
||||||
newCommand = e.cmd.CmdLine
|
newCommand = e.cmd.CmdLine
|
||||||
}
|
}
|
||||||
|
|
||||||
logrus.Infof("Replacing Entrypoint in config with %v", newCommand)
|
|
||||||
config.Entrypoint = newCommand
|
config.Entrypoint = newCommand
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -55,9 +55,13 @@ const (
|
||||||
S3BuildContextPrefix = "s3://"
|
S3BuildContextPrefix = "s3://"
|
||||||
LocalDirBuildContextPrefix = "dir://"
|
LocalDirBuildContextPrefix = "dir://"
|
||||||
|
|
||||||
// DefaultHOMEValue is the default value Docker sets for $HOME
|
|
||||||
HOME = "HOME"
|
HOME = "HOME"
|
||||||
|
// DefaultHOMEValue is the default value Docker sets for $HOME
|
||||||
DefaultHOMEValue = "/root"
|
DefaultHOMEValue = "/root"
|
||||||
|
|
||||||
|
// Docker command names
|
||||||
|
Cmd = "cmd"
|
||||||
|
Entrypoint = "entrypoint"
|
||||||
)
|
)
|
||||||
|
|
||||||
// KanikoBuildFiles is the list of files required to build kaniko
|
// KanikoBuildFiles is the list of files required to build kaniko
|
||||||
|
|
|
||||||
|
|
@ -248,6 +248,7 @@ func DoBuild(opts *config.KanikoOptions) (v1.Image, error) {
|
||||||
if err := sb.build(opts); err != nil {
|
if err := sb.build(opts); err != nil {
|
||||||
return nil, errors.Wrap(err, "error building stage")
|
return nil, errors.Wrap(err, "error building stage")
|
||||||
}
|
}
|
||||||
|
reviewConfig(stage, &sb.cf.Config)
|
||||||
sourceImage, err := mutate.Config(sb.image, sb.cf.Config)
|
sourceImage, err := mutate.Config(sb.image, sb.cf.Config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
@ -332,3 +333,23 @@ func resolveOnBuild(stage *config.KanikoStage, config *v1.Config) error {
|
||||||
config.OnBuild = nil
|
config.OnBuild = nil
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// reviewConfig makes sure the value of CMD is correct after building the stage
|
||||||
|
// If ENTRYPOINT was set in this stage but CMD wasn't, then CMD should be cleared out
|
||||||
|
// See Issue #346 for more info
|
||||||
|
func reviewConfig(stage config.KanikoStage, config *v1.Config) {
|
||||||
|
entrypoint := false
|
||||||
|
cmd := false
|
||||||
|
|
||||||
|
for _, c := range stage.Commands {
|
||||||
|
if c.Name() == constants.Cmd {
|
||||||
|
cmd = true
|
||||||
|
}
|
||||||
|
if c.Name() == constants.Entrypoint {
|
||||||
|
entrypoint = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if entrypoint && !cmd {
|
||||||
|
config.Cmd = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,76 @@
|
||||||
|
/*
|
||||||
|
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 executor
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/GoogleContainerTools/kaniko/pkg/config"
|
||||||
|
"github.com/GoogleContainerTools/kaniko/pkg/dockerfile"
|
||||||
|
"github.com/GoogleContainerTools/kaniko/testutil"
|
||||||
|
"github.com/google/go-containerregistry/pkg/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test_reviewConfig(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
dockerfile string
|
||||||
|
originalCmd []string
|
||||||
|
originalEntrypoint []string
|
||||||
|
expectedCmd []string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "entrypoint and cmd declared",
|
||||||
|
dockerfile: `
|
||||||
|
FROM scratch
|
||||||
|
CMD ["mycmd"]
|
||||||
|
ENTRYPOINT ["myentrypoint"]`,
|
||||||
|
originalEntrypoint: []string{"myentrypoint"},
|
||||||
|
originalCmd: []string{"mycmd"},
|
||||||
|
expectedCmd: []string{"mycmd"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "only entrypoint declared",
|
||||||
|
dockerfile: `
|
||||||
|
FROM scratch
|
||||||
|
ENTRYPOINT ["myentrypoint"]`,
|
||||||
|
originalEntrypoint: []string{"myentrypoint"},
|
||||||
|
originalCmd: []string{"mycmd"},
|
||||||
|
expectedCmd: nil,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, test := range tests {
|
||||||
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
config := &v1.Config{
|
||||||
|
Cmd: test.originalCmd,
|
||||||
|
Entrypoint: test.originalEntrypoint,
|
||||||
|
}
|
||||||
|
reviewConfig(stage(t, test.dockerfile), config)
|
||||||
|
testutil.CheckErrorAndDeepEqual(t, false, nil, test.expectedCmd, config.Cmd)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func stage(t *testing.T, d string) config.KanikoStage {
|
||||||
|
stages, err := dockerfile.Parse([]byte(d))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("error parsing dockerfile: %v", err)
|
||||||
|
}
|
||||||
|
return config.KanikoStage{
|
||||||
|
Stage: stages[0],
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue