diff --git a/pkg/lib/image.go b/pkg/lib/image.go index c2a68659..183cef69 100644 --- a/pkg/lib/image.go +++ b/pkg/lib/image.go @@ -59,6 +59,8 @@ type ImageCopyOpts struct { DestSkipTLS bool Progress io.Writer Context context.Context + OverrideOS string + OverrideArch string } func ImageCopy(opts ImageCopyOpts) error { @@ -90,7 +92,10 @@ func ImageCopy(opts ImageCopyOpts) error { RemoveSignatures: true, } - args.SourceCtx = &types.SystemContext{} + args.SourceCtx = &types.SystemContext{ + ArchitectureChoice: opts.OverrideArch, + OSChoice: opts.OverrideOS, + } if opts.SrcSkipTLS { args.SourceCtx.DockerInsecureSkipTLSVerify = types.OptionalBoolTrue @@ -104,7 +109,10 @@ func ImageCopy(opts ImageCopyOpts) error { } } - args.DestinationCtx = &types.SystemContext{} + args.DestinationCtx = &types.SystemContext{ + ArchitectureChoice: opts.OverrideArch, + OSChoice: opts.OverrideOS, + } if opts.DestSkipTLS { args.DestinationCtx.DockerInsecureSkipTLSVerify = types.OptionalBoolTrue diff --git a/pkg/stacker/base.go b/pkg/stacker/base.go index 99a715a9..067e8d53 100644 --- a/pkg/stacker/base.go +++ b/pkg/stacker/base.go @@ -46,7 +46,7 @@ func GetBase(o BaseLayerOpts) error { case types.OCILayer: fallthrough case types.DockerLayer: - err := importContainersImage(o.Layer.From, o.Config, o.Progress) + err := importContainersImage(o.Layer, o.Config, o.Progress) if o.Layer.Bom != nil && o.Layer.Bom.Generate && (o.Layer.From.Type == types.DockerLayer) { bomPath := path.Join(o.Config.StackerDir, "artifacts", o.Name) err = getArtifact(bomPath, "application/spdx+json", o.Layer.From.Url, "", "", o.Layer.From.Insecure) @@ -105,7 +105,8 @@ func SetupRootfs(o BaseLayerOpts) error { } } -func importContainersImage(is types.ImageSource, config types.StackerConfig, progress bool) error { +func importContainersImage(layer types.Layer, config types.StackerConfig, progress bool) error { + is := layer.From toImport, err := is.ContainersImageURL() if err != nil { return err @@ -138,12 +139,23 @@ func importContainersImage(is types.ImageSource, config types.StackerConfig, pro progressWriter = os.Stderr } + os := "" + if layer.OS != nil { + os = *layer.OS + } + arch := "" + if layer.Arch != nil { + arch = *layer.Arch + } + log.Infof("loading %s", toImport) err = lib.ImageCopy(lib.ImageCopyOpts{ - Src: toImport, - Dest: fmt.Sprintf("oci:%s:%s", cacheDir, tag), - SrcSkipTLS: is.Insecure, - Progress: progressWriter, + Src: toImport, + Dest: fmt.Sprintf("oci:%s:%s", cacheDir, tag), + SrcSkipTLS: is.Insecure, + Progress: progressWriter, + OverrideOS: os, + OverrideArch: arch, }) if err != nil { return errors.Wrapf(err, "couldn't import base layer %s", tag)