Support insecure pull (#401)
This commit is contained in:
		
							parent
							
								
									5108ee3ee1
								
							
						
					
					
						commit
						05e3250043
					
				|  | @ -91,7 +91,7 @@ func addKanikoOptionsFlags(cmd *cobra.Command) { | ||||||
| 	RootCmd.PersistentFlags().VarP(&opts.Destinations, "destination", "d", "Registry the final image should be pushed to. Set it repeatedly for multiple destinations.") | 	RootCmd.PersistentFlags().VarP(&opts.Destinations, "destination", "d", "Registry the final image should be pushed to. Set it repeatedly for multiple destinations.") | ||||||
| 	RootCmd.PersistentFlags().StringVarP(&opts.SnapshotMode, "snapshotMode", "", "full", "Change the file attributes inspected during snapshotting") | 	RootCmd.PersistentFlags().StringVarP(&opts.SnapshotMode, "snapshotMode", "", "full", "Change the file attributes inspected during snapshotting") | ||||||
| 	RootCmd.PersistentFlags().VarP(&opts.BuildArgs, "build-arg", "", "This flag allows you to pass in ARG values at build time. Set it repeatedly for multiple values.") | 	RootCmd.PersistentFlags().VarP(&opts.BuildArgs, "build-arg", "", "This flag allows you to pass in ARG values at build time. Set it repeatedly for multiple values.") | ||||||
| 	RootCmd.PersistentFlags().BoolVarP(&opts.InsecurePush, "insecure", "", false, "Push to insecure registry using plain HTTP") | 	RootCmd.PersistentFlags().BoolVarP(&opts.Insecure, "insecure", "", false, "Pull and push to insecure registry using plain HTTP") | ||||||
| 	RootCmd.PersistentFlags().BoolVarP(&opts.SkipTLSVerify, "skip-tls-verify", "", false, "Push to insecure registry ignoring TLS verify") | 	RootCmd.PersistentFlags().BoolVarP(&opts.SkipTLSVerify, "skip-tls-verify", "", false, "Push to insecure registry ignoring TLS verify") | ||||||
| 	RootCmd.PersistentFlags().StringVarP(&opts.TarPath, "tarPath", "", "", "Path to save the image in as a tarball instead of pushing") | 	RootCmd.PersistentFlags().StringVarP(&opts.TarPath, "tarPath", "", "", "Path to save the image in as a tarball instead of pushing") | ||||||
| 	RootCmd.PersistentFlags().BoolVarP(&opts.SingleSnapshot, "single-snapshot", "", false, "Take a single snapshot at the end of the build.") | 	RootCmd.PersistentFlags().BoolVarP(&opts.SingleSnapshot, "single-snapshot", "", false, "Take a single snapshot at the end of the build.") | ||||||
|  |  | ||||||
|  | @ -28,7 +28,7 @@ type KanikoOptions struct { | ||||||
| 	CacheDir       string | 	CacheDir       string | ||||||
| 	Destinations   multiArg | 	Destinations   multiArg | ||||||
| 	BuildArgs      multiArg | 	BuildArgs      multiArg | ||||||
| 	InsecurePush   bool | 	Insecure       bool | ||||||
| 	SkipTLSVerify  bool | 	SkipTLSVerify  bool | ||||||
| 	SingleSnapshot bool | 	SingleSnapshot bool | ||||||
| 	Reproducible   bool | 	Reproducible   bool | ||||||
|  |  | ||||||
|  | @ -71,7 +71,7 @@ func DoPush(image v1.Image, opts *config.KanikoOptions) error { | ||||||
| 
 | 
 | ||||||
| 	// continue pushing unless an error occurs
 | 	// continue pushing unless an error occurs
 | ||||||
| 	for _, destRef := range destRefs { | 	for _, destRef := range destRefs { | ||||||
| 		if opts.InsecurePush { | 		if opts.Insecure { | ||||||
| 			newReg, err := name.NewInsecureRegistry(destRef.Repository.Registry.Name(), name.WeakValidation) | 			newReg, err := name.NewInsecureRegistry(destRef.Repository.Registry.Name(), name.WeakValidation) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return errors.Wrap(err, "getting new insecure registry") | 				return errors.Wrap(err, "getting new insecure registry") | ||||||
|  |  | ||||||
|  | @ -17,6 +17,8 @@ limitations under the License. | ||||||
| package util | package util | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
|  | 	"crypto/tls" | ||||||
|  | 	"net/http" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| 	"strconv" | 	"strconv" | ||||||
| 
 | 
 | ||||||
|  | @ -72,7 +74,7 @@ func RetrieveSourceImage(stage config.KanikoStage, buildArgs []string, opts *con | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Otherwise, initialize image as usual
 | 	// Otherwise, initialize image as usual
 | ||||||
| 	return retrieveRemoteImage(currentBaseName) | 	return retrieveRemoteImage(currentBaseName, opts) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // RetrieveConfigFile returns the config file for an image
 | // RetrieveConfigFile returns the config file for an image
 | ||||||
|  | @ -93,18 +95,41 @@ func tarballImage(index int) (v1.Image, error) { | ||||||
| 	return tarball.ImageFromPath(tarPath, nil) | 	return tarball.ImageFromPath(tarPath, nil) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func remoteImage(image string) (v1.Image, error) { | func remoteImage(image string, opts *config.KanikoOptions) (v1.Image, error) { | ||||||
| 	logrus.Infof("Downloading base image %s", image) | 	logrus.Infof("Downloading base image %s", image) | ||||||
| 	ref, err := name.ParseReference(image, name.WeakValidation) | 	ref, err := name.ParseReference(image, name.WeakValidation) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	if opts.Insecure { | ||||||
|  | 		newReg, err := name.NewInsecureRegistry(ref.Context().RegistryStr(), name.WeakValidation) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 		if tag, ok := ref.(name.Tag); ok { | ||||||
|  | 			tag.Repository.Registry = newReg | ||||||
|  | 			ref = tag | ||||||
|  | 		} | ||||||
|  | 		if digest, ok := ref.(name.Digest); ok { | ||||||
|  | 			digest.Repository.Registry = newReg | ||||||
|  | 			ref = digest | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	tr := http.DefaultTransport.(*http.Transport) | ||||||
|  | 	if opts.SkipTLSVerify { | ||||||
|  | 		tr.TLSClientConfig = &tls.Config{ | ||||||
|  | 			InsecureSkipVerify: true, | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	k8sc, err := k8schain.NewNoClient() | 	k8sc, err := k8schain.NewNoClient() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	kc := authn.NewMultiKeychain(authn.DefaultKeychain, k8sc) | 	kc := authn.NewMultiKeychain(authn.DefaultKeychain, k8sc) | ||||||
| 	return remote.Image(ref, remote.WithAuthFromKeychain(kc)) | 	return remote.Image(ref, remote.WithTransport(tr), remote.WithAuthFromKeychain(kc)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func cachedImage(opts *config.KanikoOptions, image string) (v1.Image, error) { | func cachedImage(opts *config.KanikoOptions, image string) (v1.Image, error) { | ||||||
|  |  | ||||||
|  | @ -51,7 +51,7 @@ func Test_StandardImage(t *testing.T) { | ||||||
| 	defer func() { | 	defer func() { | ||||||
| 		retrieveRemoteImage = original | 		retrieveRemoteImage = original | ||||||
| 	}() | 	}() | ||||||
| 	mock := func(image string) (v1.Image, error) { | 	mock := func(image string, opts *config.KanikoOptions) (v1.Image, error) { | ||||||
| 		return nil, nil | 		return nil, nil | ||||||
| 	} | 	} | ||||||
| 	retrieveRemoteImage = mock | 	retrieveRemoteImage = mock | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue