Add --single-snapshot flag to snapshot once after the build
This commit is contained in:
		
							parent
							
								
									e18ef26a6c
								
							
						
					
					
						commit
						89c9f15bde
					
				|  | @ -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) | ||||||
|  |  | ||||||
|  | @ -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) | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue