77 lines
1.8 KiB
Go
77 lines
1.8 KiB
Go
|
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"`
|
||
|
}
|