CLI to get binaries from a docker image with multi arch support
have a look at the README.md to see how it works. Bootstrap a CLI program to copy binaries from multi arch images Signed-off-by: Gianluca Arbezzano <gianarb92@gmail.com>
This commit is contained in:
76
cmd/getbinariesfromquay/docker/image.go
Normal file
76
cmd/getbinariesfromquay/docker/image.go
Normal file
@ -0,0 +1,76 @@
|
||||
package docker
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/containers/image/v5/copy"
|
||||
"github.com/containers/image/v5/manifest"
|
||||
"github.com/containers/image/v5/signature"
|
||||
"github.com/containers/image/v5/transports/alltransports"
|
||||
"github.com/containers/image/v5/types"
|
||||
)
|
||||
|
||||
type Image struct {
|
||||
src types.ImageSource
|
||||
ref types.ImageReference
|
||||
sys *types.SystemContext
|
||||
}
|
||||
|
||||
func ImageFromName(ctx context.Context, sys *types.SystemContext, name string) (*Image, error) {
|
||||
imageRef, err := alltransports.ParseImageName(name)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
src, err := imageRef.NewImageSource(ctx, sys)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &Image{
|
||||
src: src,
|
||||
ref: imageRef,
|
||||
sys: sys,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (img *Image) GetManifest(ctx context.Context) ([]byte, string, error) {
|
||||
rawManifest, _, err := img.src.GetManifest(ctx, nil)
|
||||
if err != nil {
|
||||
return nil, "", err
|
||||
}
|
||||
return rawManifest, manifest.GuessMIMEType(rawManifest), nil
|
||||
}
|
||||
|
||||
func (img *Image) Copy(ctx context.Context, dst string) error {
|
||||
destRef, err := alltransports.ParseImageName(dst)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
pc, err := signature.NewPolicyContext(&signature.Policy{
|
||||
Default: []signature.PolicyRequirement{
|
||||
signature.NewPRInsecureAcceptAnything(),
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = copy.Image(ctx, pc, destRef, img.ref, ©.Options{SourceCtx: img.sys})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type SchemaV2List struct {
|
||||
MediaType string `json:"mediaType"`
|
||||
SchemaVersion int `json:"schemaVersion"`
|
||||
Manifests []struct {
|
||||
MediaType string `json:"mediaType"`
|
||||
Digest string `json:"digest"`
|
||||
Size int `json:"size"`
|
||||
Platform struct {
|
||||
Architecture string `json:"architecture"`
|
||||
Os string `json:"os"`
|
||||
Variant string `json:"variant"`
|
||||
} `json:"platform,omitempty"`
|
||||
} `json:"manifests"`
|
||||
}
|
Reference in New Issue
Block a user