Resolved Merge Conflicts
Signed-off-by: Kartik Verma <vkartik97@gmail.com>
This commit is contained in:
		
						commit
						f137f81884
					
				
							
								
								
									
										18
									
								
								CHANGELOG.md
								
								
								
								
							
							
						
						
									
										18
									
								
								CHANGELOG.md
								
								
								
								
							|  | @ -1,11 +1,11 @@ | |||
| # v0.9.0 Release - 2/8/2019 | ||||
| # v0.9.0 Release - 2019-02-08 | ||||
| 
 | ||||
| ## Bug Fixes | ||||
| * Bug fix with volumes declared in base images during multi-stage builds | ||||
| * Bug fix during snapshotting multi-stage builds. | ||||
| * Bug fix for caching with tar output. | ||||
| 
 | ||||
| # v0.8.0 Release - 1/29/2019 | ||||
| # v0.8.0 Release - 2019-01-29 | ||||
| 
 | ||||
| ## New Features | ||||
| * Even faster snapshotting with godirwalk | ||||
|  | @ -20,7 +20,7 @@ | |||
| * Fix bug with USER command and unpacking base images. | ||||
| * Added COPY --from=previous stage name/number validation | ||||
| 
 | ||||
| # v0.7.0 Release - 12/10/2018 | ||||
| # v0.7.0 Release - 2018-12-10 | ||||
| 
 | ||||
| ## New Features | ||||
| * Add support for COPY --from an unrelated image | ||||
|  | @ -34,7 +34,7 @@ | |||
| * Fix bug with call loop | ||||
| * Fix caching for multi-step builds | ||||
| 
 | ||||
| # v0.6.0 Release - 11/06/2018 | ||||
| # v0.6.0 Release - 2018-11-06 | ||||
| 
 | ||||
| ## New Features | ||||
| * parse arg commands at the top of dockerfiles [#404](https://github.com/GoogleContainerTools/kaniko/pull/404) | ||||
|  | @ -59,7 +59,7 @@ | |||
| * fix releasing the cache warmer [#418](https://github.com/GoogleContainerTools/kaniko/pull/418) | ||||
| 
 | ||||
| 
 | ||||
| # v0.5.0 Release - 10/16/2018 | ||||
| # v0.5.0 Release - 2018-10-16 | ||||
| 
 | ||||
| ## New Features | ||||
| * Persistent volume caching for base images [#383](https://github.com/GoogleContainerTools/kaniko/pull/383) | ||||
|  | @ -78,7 +78,7 @@ | |||
| * Don't cut everything after an equals sign [#381](https://github.com/GoogleContainerTools/kaniko/pull/381) | ||||
| 
 | ||||
| 
 | ||||
| # v0.4.0 Release - 10/01/2018 | ||||
| # v0.4.0 Release - 2018-10-01 | ||||
| 
 | ||||
| ## New Features | ||||
| * Add a benchmark package to store and monitor timings. [#367](https://github.com/GoogleContainerTools/kaniko/pull/367) | ||||
|  | @ -137,7 +137,7 @@ | |||
| * Fix handling of the volume directive [#334](https://github.com/GoogleContainerTools/kaniko/pull/334) | ||||
| 
 | ||||
| 
 | ||||
| # v0.3.0 Release - 7/31/2018 | ||||
| # v0.3.0 Release - 2018-07-31 | ||||
| New Features | ||||
| * Local integration testing [#256](https://github.com/GoogleContainerTools/kaniko/pull/256) | ||||
| * Add --target flag for multistage builds [#255](https://github.com/GoogleContainerTools/kaniko/pull/255) | ||||
|  | @ -149,7 +149,7 @@ Bug Fixes | |||
| * Multi-stage errors when referencing earlier stages [#233](https://github.com/GoogleContainerTools/kaniko/issues/233) | ||||
| 
 | ||||
| 
 | ||||
| # v0.2.0 Release - 7/09/2018 | ||||
| # v0.2.0 Release - 2018-07-09 | ||||
| 
 | ||||
| New Features | ||||
| * Support for adding different source contexts, including Amazon S3 [#195](https://github.com/GoogleContainerTools/kaniko/issues/195) | ||||
|  | @ -158,7 +158,7 @@ New Features | |||
| * Update go-containerregistry so kaniko works better with Harbor and Gitlab[#227](https://github.com/GoogleContainerTools/kaniko/pull/227) | ||||
| * Push image to multiple destinations [#184](https://github.com/GoogleContainerTools/kaniko/pull/184) | ||||
| 
 | ||||
| # v0.1.0 Release - 5/17/2018 | ||||
| # v0.1.0 Release - 2018-05-17 | ||||
| 
 | ||||
| New Features | ||||
| * The majority of Dockerfile commands are feature complete [#1](https://github.com/GoogleContainerTools/kaniko/issues/1) | ||||
|  |  | |||
|  | @ -735,6 +735,14 @@ | |||
|   pruneopts = "NUT" | ||||
|   revision = "7e9a647135a142c2669943d4a4d29be015ce9392" | ||||
| 
 | ||||
| [[projects]] | ||||
|   branch = "master" | ||||
|   digest = "1:15057fc7395024283a7d2639b8afc61c5b6df3fe260ce06ff5834c8464f16b5c" | ||||
|   name = "github.com/otiai10/copy" | ||||
|   packages = ["."] | ||||
|   pruneopts = "NUT" | ||||
|   revision = "7e9a647135a142c2669943d4a4d29be015ce9392" | ||||
| 
 | ||||
| [[projects]] | ||||
|   branch = "master" | ||||
|   digest = "1:3bf17a6e6eaa6ad24152148a631d18662f7212e21637c2699bff3369b7f00fa2" | ||||
|  |  | |||
							
								
								
									
										29
									
								
								README.md
								
								
								
								
							
							
						
						
									
										29
									
								
								README.md
								
								
								
								
							|  | @ -40,6 +40,7 @@ _If you are interested in contributing to kaniko, see [DEVELOPMENT.md](DEVELOPME | |||
|     - [--cache-dir](#--cache-dir) | ||||
|     - [--cache-repo](#--cache-repo) | ||||
|     - [--cleanup](#--cleanup) | ||||
|     - [--digest-file](#--digest-file) | ||||
|     - [--insecure](#--insecure) | ||||
|     - [--insecure-pull](#--insecure-pull) | ||||
|     - [--no-push](#--no-push) | ||||
|  | @ -50,6 +51,7 @@ _If you are interested in contributing to kaniko, see [DEVELOPMENT.md](DEVELOPME | |||
|     - [--skip-tls-verify-pull](#--skip-tls-verify-pull) | ||||
|     - [--target](#--target) | ||||
|     - [--tarPath](#--tarpath) | ||||
|     - [--verbosity](#--verbosity) | ||||
|   - [Debug Image](#debug-image) | ||||
| - [Security](#security) | ||||
| - [Comparison with Other Tools](#comparison-with-other-tools) | ||||
|  | @ -359,9 +361,21 @@ If `--destination=gcr.io/kaniko-project/test`, then cached layers will be stored | |||
| 
 | ||||
| _This flag must be used in conjunction with the `--cache=true` flag._ | ||||
| 
 | ||||
| 
 | ||||
| #### --digest-file | ||||
| 
 | ||||
| Set this flag to specify a file in the container. This file will | ||||
| receive the digest of a built image. This can be used to | ||||
| automatically track the exact image built by Kaniko. | ||||
| 
 | ||||
| For example, setting the flag to `--digest-file=/dev/termination-log` | ||||
| will write the digest to that file, which is picked up by | ||||
| Kubernetes automatically as the `{{.state.terminated.message}}` | ||||
| of the container. | ||||
| 
 | ||||
| #### --insecure-registry | ||||
| 
 | ||||
| Set this flag to use plain HTTP requests when accessing a registry. It is supposed to be useed for testing purposes only and should not be used in production! | ||||
| Set this flag to use plain HTTP requests when accessing a registry. It is supposed to be used for testing purposes only and should not be used in production! | ||||
| You can set it multiple times for multiple registries. | ||||
| 
 | ||||
| #### --skip-tls-verify-registry | ||||
|  | @ -415,6 +429,10 @@ Set this flag to indicate which build stage is the target build stage. | |||
| 
 | ||||
| Set this flag as `--tarPath=<path>` to save the image as a tarball at path instead of pushing the image. | ||||
| 
 | ||||
| #### --verbosity | ||||
| 
 | ||||
| Set this flag as `--verbosity=<panic|fatal|error|warn|info|debug>` to set the logging level. Defaults to `info`. | ||||
| 
 | ||||
| ### Debug Image | ||||
| 
 | ||||
| The kaniko executor image is based off of scratch and doesn't contain a shell. | ||||
|  | @ -449,6 +467,7 @@ You may be able to achieve the same default seccomp profile that Docker uses in | |||
| 
 | ||||
| Similar tools include: | ||||
| 
 | ||||
| - [BuildKit](https://github.com/moby/buildkit) | ||||
| - [img](https://github.com/genuinetools/img) | ||||
| - [orca-build](https://github.com/cyphar/orca-build) | ||||
| - [umoci](https://github.com/openSUSE/umoci) | ||||
|  | @ -458,10 +477,10 @@ Similar tools include: | |||
| 
 | ||||
| All of these tools build container images with different approaches. | ||||
| 
 | ||||
| `img` can perform as a non root user from within a container, but requires that | ||||
| the `img` container has `RawProc` access to create nested containers.  `kaniko` | ||||
| does not actually create nested containers, so it does not require `RawProc` | ||||
| access. | ||||
| BuildKit (and `img`) can perform as a non root user from within a container, but requires | ||||
| seccomp and AppArmor to be disabled to create nested containers.  `kaniko` | ||||
| does not actually create nested containers, so it does not require seccomp and AppArmor | ||||
| to be disabled. | ||||
| 
 | ||||
| `orca-build` depends on `runc` to build images from Dockerfiles, which can not | ||||
| run inside a container (for similar reasons to `img` above). `kaniko` doesn't | ||||
|  |  | |||
|  | @ -128,6 +128,7 @@ func addKanikoOptionsFlags(cmd *cobra.Command) { | |||
| 	RootCmd.PersistentFlags().BoolVarP(&opts.NoPush, "no-push", "", false, "Do not push the image to the registry") | ||||
| 	RootCmd.PersistentFlags().StringVarP(&opts.CacheRepo, "cache-repo", "", "", "Specify a repository to use as a cache, otherwise one will be inferred from the destination provided") | ||||
| 	RootCmd.PersistentFlags().StringVarP(&opts.CacheDir, "cache-dir", "", "/cache", "Specify a local directory to use as a cache.") | ||||
| 	RootCmd.PersistentFlags().StringVarP(&opts.DigestFile, "digest-file", "", "", "Specify a file to save the digest of the built image to.") | ||||
| 	RootCmd.PersistentFlags().BoolVarP(&opts.Cache, "cache", "", false, "Use cache when building image") | ||||
| 	RootCmd.PersistentFlags().BoolVarP(&opts.Cleanup, "cleanup", "", false, "Clean the filesystem at the end") | ||||
| 	RootCmd.PersistentFlags().DurationVarP(&opts.CacheTTL, "cache-ttl", "", time.Hour*336, "Cache timeout in hours. Defaults to two weeks.") | ||||
|  |  | |||
|  | @ -16,15 +16,7 @@ | |||
| # If the image is built twice, /date should be the same in both images | ||||
| # if the cache is implemented correctly | ||||
| 
 | ||||
| FROM alpine as base_stage | ||||
| 
 | ||||
| RUN mkdir foo && echo base_stage > foo/base | ||||
| 
 | ||||
| FROM base_stage as cached_stage | ||||
| 
 | ||||
| RUN echo cached_stage > foo/cache | ||||
| 
 | ||||
| FROM cached_stage as bug_stage | ||||
| 
 | ||||
| RUN echo bug_stage > foo/bug | ||||
| FROM gcr.io/google-appengine/debian9@sha256:1d6a9a6d106bd795098f60f4abb7083626354fa6735e81743c7f8cfca11259f0 | ||||
| RUN date > /date | ||||
| COPY context/foo /foo | ||||
| RUN echo hey | ||||
|  |  | |||
|  | @ -30,6 +30,7 @@ type KanikoOptions struct { | |||
| 	Target                  string | ||||
| 	CacheRepo               string | ||||
| 	CacheDir                string | ||||
| 	DigestFile              string | ||||
| 	Destinations            multiArg | ||||
| 	BuildArgs               multiArg | ||||
| 	Insecure                bool | ||||
|  |  | |||
|  | @ -190,12 +190,7 @@ func (s *stageBuilder) optimize(compositeKey CompositeCache, cfg v1.Config) erro | |||
| 
 | ||||
| func (s *stageBuilder) build() error { | ||||
| 	// Set the initial cache key to be the base image digest, the build args and the SrcContext.
 | ||||
| 	dgst, err := util.ReproducibleDigest(s.image) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	compositeKey := NewCompositeCache(dgst) | ||||
| 	compositeKey.AddKey(s.opts.BuildArgs...) | ||||
| 	compositeKey := NewCompositeCache(s.baseImageDigest) | ||||
| 
 | ||||
| 	// Apply optimizations to the instructions.
 | ||||
| 	if err := s.optimize(*compositeKey, s.cf.Config); err != nil { | ||||
|  |  | |||
|  | @ -19,6 +19,7 @@ package executor | |||
| import ( | ||||
| 	"crypto/tls" | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"net/http" | ||||
| 	"time" | ||||
| 
 | ||||
|  | @ -74,6 +75,19 @@ func CheckPushPermissions(opts *config.KanikoOptions) error { | |||
| // DoPush is responsible for pushing image to the destinations specified in opts
 | ||||
| func DoPush(image v1.Image, opts *config.KanikoOptions) error { | ||||
| 	t := timing.Start("Total Push Time") | ||||
| 
 | ||||
| 	if opts.DigestFile != "" { | ||||
| 		digest, err := image.Digest() | ||||
| 		if err != nil { | ||||
| 			return errors.Wrap(err, "error fetching digest") | ||||
| 		} | ||||
| 		digestByteArray := []byte(digest.String()) | ||||
| 		err = ioutil.WriteFile(opts.DigestFile, digestByteArray, 0644) | ||||
| 		if err != nil { | ||||
| 			return errors.Wrap(err, "writing digest to file failed") | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	destRefs := []name.Tag{} | ||||
| 	for _, destination := range opts.Destinations { | ||||
| 		destRef, err := name.NewTag(destination, name.WeakValidation) | ||||
|  |  | |||
|  | @ -178,7 +178,7 @@ func (s *Snapshotter) scanFullFilesystem() ([]string, []string, error) { | |||
| 			return nil, nil, err | ||||
| 		} | ||||
| 		if fileChanged { | ||||
| 			logrus.Infof("Adding %s to layer, because it was changed.", path) | ||||
| 			logrus.Debugf("Adding %s to layer, because it was changed.", path) | ||||
| 			filesToAdd = append(filesToAdd, path) | ||||
| 		} | ||||
| 	} | ||||
|  |  | |||
|  | @ -79,10 +79,7 @@ func GetFSFromImage(root string, img v1.Image) ([]string, error) { | |||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	// Store a map of files to their mtime. We need to set mtimes in a second pass because creating files
 | ||||
| 	// can change the mtime of a directory.
 | ||||
| 	extractedFiles := map[string]time.Time{} | ||||
| 	extractedFiles := []string{} | ||||
| 
 | ||||
| 	for i, l := range layers { | ||||
| 		logrus.Debugf("Extracting layer %d", i) | ||||
|  | @ -113,17 +110,10 @@ func GetFSFromImage(root string, img v1.Image) ([]string, error) { | |||
| 			if err := extractFile(root, hdr, tr); err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			extractedFiles[filepath.Join(root, filepath.Clean(hdr.Name))] = hdr.ModTime | ||||
| 			extractedFiles = append(extractedFiles, filepath.Join(root, filepath.Clean(hdr.Name))) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	fileNames := []string{} | ||||
| 	for f, t := range extractedFiles { | ||||
| 		fileNames = append(fileNames, f) | ||||
| 		os.Chtimes(f, time.Time{}, t) | ||||
| 	} | ||||
| 
 | ||||
| 	return fileNames, nil | ||||
| 	return extractedFiles, nil | ||||
| } | ||||
| 
 | ||||
| // DeleteFilesystem deletes the extracted image file system
 | ||||
|  | @ -272,7 +262,6 @@ func extractFile(dest string, hdr *tar.Header, tr io.Reader) error { | |||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
|  | @ -377,8 +366,7 @@ func RelativeFiles(fp string, root string) ([]string, error) { | |||
| } | ||||
| 
 | ||||
| // ParentDirectories returns a list of paths to all parent directories
 | ||||
| // Ex. /some/temp/dir -> [/some, /some/temp, /some/temp/dir]
 | ||||
| // This purposefully excludes the /.
 | ||||
| // Ex. /some/temp/dir -> [/, /some, /some/temp, /some/temp/dir]
 | ||||
| func ParentDirectories(path string) []string { | ||||
| 	path = filepath.Clean(path) | ||||
| 	dirs := strings.Split(path, "/") | ||||
|  |  | |||
|  | @ -54,7 +54,6 @@ func (t *Tar) Close() { | |||
| 
 | ||||
| // AddFileToTar adds the file at path p to the tar
 | ||||
| func (t *Tar) AddFileToTar(p string) error { | ||||
| 	logrus.Debugf("Adding file %s to tar", p) | ||||
| 	i, err := os.Lstat(p) | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("Failed to get file info for %s: %s", p, err) | ||||
|  |  | |||
|  | @ -20,14 +20,11 @@ import ( | |||
| 	"crypto/md5" | ||||
| 	"crypto/sha256" | ||||
| 	"encoding/hex" | ||||
| 	"encoding/json" | ||||
| 	"io" | ||||
| 	"os" | ||||
| 	"strconv" | ||||
| 	"syscall" | ||||
| 
 | ||||
| 	"github.com/google/go-containerregistry/pkg/v1" | ||||
| 	"github.com/google/go-containerregistry/pkg/v1/partial" | ||||
| 	"github.com/pkg/errors" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| ) | ||||
|  | @ -130,29 +127,3 @@ func SHA256(r io.Reader) (string, error) { | |||
| 	} | ||||
| 	return hex.EncodeToString(hasher.Sum(make([]byte, 0, hasher.Size()))), nil | ||||
| } | ||||
| 
 | ||||
| type ReproducibleManifest struct { | ||||
| 	Layers []v1.Descriptor | ||||
| 	Config v1.Config | ||||
| } | ||||
| 
 | ||||
| func ReproducibleDigest(img partial.WithManifestAndConfigFile) (string, error) { | ||||
| 	mfst, err := img.Manifest() | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	cfg, err := img.ConfigFile() | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	rm := ReproducibleManifest{ | ||||
| 		Layers: mfst.Layers, | ||||
| 		Config: cfg.Config, | ||||
| 	} | ||||
| 
 | ||||
| 	b, err := json.Marshal(rm) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	return string(b), nil | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue