Add --single-snapshot flag to snapshot once after the build

This commit is contained in:
Priya Wadhwa 2018-06-13 10:39:52 -07:00
parent e18ef26a6c
commit 89c9f15bde
3 changed files with 39 additions and 10 deletions

View File

@ -40,6 +40,7 @@ var (
force bool force bool
buildArgs multiArg buildArgs multiArg
tarPath string tarPath string
singleSnapshot bool
) )
func init() { func init() {
@ -54,6 +55,7 @@ func init() {
RootCmd.PersistentFlags().StringVarP(&logLevel, "verbosity", "v", constants.DefaultLogLevel, "Log level (debug, info, warn, error, fatal, panic") RootCmd.PersistentFlags().StringVarP(&logLevel, "verbosity", "v", constants.DefaultLogLevel, "Log level (debug, info, warn, error, fatal, panic")
RootCmd.PersistentFlags().BoolVarP(&force, "force", "", false, "Force building outside of a container") RootCmd.PersistentFlags().BoolVarP(&force, "force", "", false, "Force building outside of a container")
RootCmd.PersistentFlags().StringVarP(&tarPath, "tarPath", "", "", "Path to save the image in as a tarball instead of pushing") RootCmd.PersistentFlags().StringVarP(&tarPath, "tarPath", "", "", "Path to save the image in as a tarball instead of pushing")
RootCmd.PersistentFlags().BoolVarP(&singleSnapshot, "single-snapshot", "", false, "Set this flag to take a single snapshot at the end of the build.")
} }
var RootCmd = &cobra.Command{ var RootCmd = &cobra.Command{
@ -79,7 +81,13 @@ var RootCmd = &cobra.Command{
logrus.Error(err) logrus.Error(err)
os.Exit(1) os.Exit(1)
} }
ref, image, err := executor.DoBuild(dockerfilePath, srcContext, snapshotMode, buildArgs) ref, image, err := executor.DoBuild(executor.KanikoBuildArgs{
DockerfilePath: dockerfilePath,
SrcContext: srcContext,
SnapshotMode: snapshotMode,
Args: buildArgs,
SingleSnapshot: singleSnapshot,
})
if err != nil { if err != nil {
logrus.Error(err) logrus.Error(err)
os.Exit(1) os.Exit(1)

View File

@ -106,6 +106,12 @@ func TestRun(t *testing.T) {
"Dockerfile_test_multistage": {"file=/foo2"}, "Dockerfile_test_multistage": {"file=/foo2"},
} }
// Map for additional flags
additionalFlagsMap := map[string][]string{
"Dockerfile_test_add": {"--single-snapshot"},
"Dockerfile_test_scratch": {"--single-snapshot"},
}
bucketContextTests := []string{"Dockerfile_test_copy_bucket"} bucketContextTests := []string{"Dockerfile_test_copy_bucket"}
// TODO: remove test_user_run from this when https://github.com/GoogleContainerTools/container-diff/issues/237 is fixed // TODO: remove test_user_run from this when https://github.com/GoogleContainerTools/container-diff/issues/237 is fixed
@ -130,6 +136,7 @@ func TestRun(t *testing.T) {
buildArgs = append(buildArgs, buildArgFlag) buildArgs = append(buildArgs, buildArgFlag)
buildArgs = append(buildArgs, arg) buildArgs = append(buildArgs, arg)
} }
// build docker image // build docker image
dockerImage := strings.ToLower(testRepo + dockerPrefix + dockerfile) dockerImage := strings.ToLower(testRepo + dockerPrefix + dockerfile)
dockerCmd := exec.Command("docker", dockerCmd := exec.Command("docker",
@ -152,6 +159,7 @@ func TestRun(t *testing.T) {
} }
// build kaniko image // build kaniko image
additionalFlags := append(buildArgs, additionalFlagsMap[dockerfile]...)
kanikoImage := strings.ToLower(testRepo + kanikoPrefix + dockerfile) kanikoImage := strings.ToLower(testRepo + kanikoPrefix + dockerfile)
kanikoCmd := exec.Command("docker", kanikoCmd := exec.Command("docker",
append([]string{"run", append([]string{"run",
@ -161,7 +169,7 @@ func TestRun(t *testing.T) {
"-f", path.Join(buildContextPath, dockerfilesPath, dockerfile), "-f", path.Join(buildContextPath, dockerfilesPath, dockerfile),
"-d", kanikoImage, "-d", kanikoImage,
contextFlag, contextPath}, contextFlag, contextPath},
buildArgs...)..., additionalFlags...)...,
) )
RunCommand(kanikoCmd, t) RunCommand(kanikoCmd, t)

View File

@ -45,9 +45,18 @@ import (
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
func DoBuild(dockerfilePath, srcContext, snapshotMode string, args []string) (name.Reference, v1.Image, error) { // KanikoBuildArgs contains all the args required to build the image
type KanikoBuildArgs struct {
DockerfilePath string
SrcContext string
SnapshotMode string
Args []string
SingleSnapshot bool
}
func DoBuild(k KanikoBuildArgs) (name.Reference, v1.Image, error) {
// Parse dockerfile and unpack base image to root // Parse dockerfile and unpack base image to root
d, err := ioutil.ReadFile(dockerfilePath) d, err := ioutil.ReadFile(k.DockerfilePath)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
@ -58,12 +67,12 @@ func DoBuild(dockerfilePath, srcContext, snapshotMode string, args []string) (na
} }
dockerfile.ResolveStages(stages) dockerfile.ResolveStages(stages)
hasher, err := getHasher(snapshotMode) hasher, err := getHasher(k.SnapshotMode)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
for index, stage := range stages { for index, stage := range stages {
baseImage, err := util.ResolveEnvironmentReplacement(stage.BaseName, args, false) baseImage, err := util.ResolveEnvironmentReplacement(stage.BaseName, k.Args, false)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
@ -109,9 +118,10 @@ func DoBuild(dockerfilePath, srcContext, snapshotMode string, args []string) (na
if err := resolveOnBuild(&stage, &imageConfig.Config); err != nil { if err := resolveOnBuild(&stage, &imageConfig.Config); err != nil {
return nil, nil, err return nil, nil, err
} }
buildArgs := dockerfile.NewBuildArgs(args) buildArgs := dockerfile.NewBuildArgs(k.Args)
for _, cmd := range stage.Commands { for index, cmd := range stage.Commands {
dockerCommand, err := commands.GetCommand(cmd, srcContext) finalCmd := index == len(stage.Commands)-1
dockerCommand, err := commands.GetCommand(cmd, k.SrcContext)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
@ -121,11 +131,14 @@ func DoBuild(dockerfilePath, srcContext, snapshotMode string, args []string) (na
if err := dockerCommand.ExecuteCommand(&imageConfig.Config, buildArgs); err != nil { if err := dockerCommand.ExecuteCommand(&imageConfig.Config, buildArgs); err != nil {
return nil, nil, err return nil, nil, err
} }
if !finalStage { if !finalStage || (k.SingleSnapshot && !finalCmd) {
continue continue
} }
// Now, we get the files to snapshot from this command and take the snapshot // Now, we get the files to snapshot from this command and take the snapshot
snapshotFiles := dockerCommand.FilesToSnapshot() snapshotFiles := dockerCommand.FilesToSnapshot()
if k.SingleSnapshot && finalCmd {
snapshotFiles = nil
}
contents, err := snapshotter.TakeSnapshot(snapshotFiles) contents, err := snapshotter.TakeSnapshot(snapshotFiles)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err