Merge pull request #9155 from neersighted/image_cleanup_2
Use mediatype helpers in more places
This commit is contained in:
commit
e8770b1716
@ -120,24 +120,24 @@ func WithImageConfigLabels(image Image) NewContainerOpts {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if !images.IsConfigType(ic.MediaType) {
|
||||||
|
return fmt.Errorf("unknown image config media type %s", ic.MediaType)
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
ociimage v1.Image
|
ociimage v1.Image
|
||||||
config v1.ImageConfig
|
config v1.ImageConfig
|
||||||
)
|
)
|
||||||
switch ic.MediaType {
|
p, err := content.ReadBlob(ctx, image.ContentStore(), ic)
|
||||||
case v1.MediaTypeImageConfig, images.MediaTypeDockerSchema2Config:
|
if err != nil {
|
||||||
p, err := content.ReadBlob(ctx, image.ContentStore(), ic)
|
return err
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := json.Unmarshal(p, &ociimage); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
config = ociimage.Config
|
|
||||||
default:
|
|
||||||
return fmt.Errorf("unknown image config media type %s", ic.MediaType)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err = json.Unmarshal(p, &ociimage); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
config = ociimage.Config
|
||||||
|
|
||||||
c.Labels = config.Labels
|
c.Labels = config.Labels
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -116,8 +116,7 @@ func TestExportDockerManifest(t *testing.T) {
|
|||||||
// test single-platform export
|
// test single-platform export
|
||||||
var result ocispec.Descriptor
|
var result ocispec.Descriptor
|
||||||
err = images.Walk(ctx, images.HandlerFunc(func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
|
err = images.Walk(ctx, images.HandlerFunc(func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
|
||||||
switch desc.MediaType {
|
if images.IsManifestType(desc.MediaType) {
|
||||||
case images.MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest:
|
|
||||||
p, err := content.ReadBlob(ctx, client.ContentStore(), desc)
|
p, err := content.ReadBlob(ctx, client.ContentStore(), desc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -132,7 +131,7 @@ func TestExportDockerManifest(t *testing.T) {
|
|||||||
result = desc
|
result = desc
|
||||||
}
|
}
|
||||||
return nil, nil
|
return nil, nil
|
||||||
case images.MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex:
|
} else if images.IsIndexType(desc.MediaType) {
|
||||||
p, err := content.ReadBlob(ctx, client.ContentStore(), desc)
|
p, err := content.ReadBlob(ctx, client.ContentStore(), desc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -376,27 +376,25 @@ func WithImageConfigArgs(image Image, args []string) SpecOpts {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if !images.IsConfigType(ic.MediaType) {
|
||||||
|
return fmt.Errorf("unknown image config media type %s", ic.MediaType)
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
imageConfigBytes []byte
|
imageConfigBytes []byte
|
||||||
ociimage v1.Image
|
ociimage v1.Image
|
||||||
config v1.ImageConfig
|
config v1.ImageConfig
|
||||||
)
|
)
|
||||||
switch ic.MediaType {
|
imageConfigBytes, err = content.ReadBlob(ctx, image.ContentStore(), ic)
|
||||||
case v1.MediaTypeImageConfig, images.MediaTypeDockerSchema2Config:
|
if err != nil {
|
||||||
var err error
|
return err
|
||||||
imageConfigBytes, err = content.ReadBlob(ctx, image.ContentStore(), ic)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := json.Unmarshal(imageConfigBytes, &ociimage); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
config = ociimage.Config
|
|
||||||
default:
|
|
||||||
return fmt.Errorf("unknown image config media type %s", ic.MediaType)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err = json.Unmarshal(imageConfigBytes, &ociimage); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
config = ociimage.Config
|
||||||
|
|
||||||
appendOSMounts(s, ociimage.OS)
|
appendOSMounts(s, ociimage.OS)
|
||||||
setProcess(s)
|
setProcess(s)
|
||||||
if s.Linux != nil {
|
if s.Linux != nil {
|
||||||
|
@ -135,8 +135,7 @@ func (p *ImageTreePrinter) printManifestTree(ctx context.Context, desc ocispec.D
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
switch desc.MediaType {
|
if images.IsManifestType(desc.MediaType) {
|
||||||
case images.MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest:
|
|
||||||
var manifest ocispec.Manifest
|
var manifest ocispec.Manifest
|
||||||
if err := json.Unmarshal(b, &manifest); err != nil {
|
if err := json.Unmarshal(b, &manifest); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -158,8 +157,7 @@ func (p *ImageTreePrinter) printManifestTree(ctx context.Context, desc ocispec.D
|
|||||||
}
|
}
|
||||||
fmt.Fprintf(p.w, "%s%s @%s (%d bytes)\n", subprefix, manifest.Layers[i].MediaType, manifest.Layers[i].Digest, manifest.Layers[i].Size)
|
fmt.Fprintf(p.w, "%s%s @%s (%d bytes)\n", subprefix, manifest.Layers[i].MediaType, manifest.Layers[i].Digest, manifest.Layers[i].Size)
|
||||||
}
|
}
|
||||||
|
} else if images.IsIndexType(desc.MediaType) {
|
||||||
case images.MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex:
|
|
||||||
var idx ocispec.Index
|
var idx ocispec.Index
|
||||||
if err := json.Unmarshal(b, &idx); err != nil {
|
if err := json.Unmarshal(b, &idx); err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -55,8 +55,7 @@ func AppendInfoHandlerWrapper(ref string) func(f images.Handler) images.Handler
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
switch desc.MediaType {
|
if images.IsManifestType(desc.MediaType) {
|
||||||
case ocispec.MediaTypeImageManifest, images.MediaTypeDockerSchema2Manifest:
|
|
||||||
for i := range children {
|
for i := range children {
|
||||||
c := &children[i]
|
c := &children[i]
|
||||||
if images.IsLayerType(c.MediaType) {
|
if images.IsLayerType(c.MediaType) {
|
||||||
|
@ -255,24 +255,22 @@ func (ts *localTransferService) pull(ctx context.Context, ir transfer.ImageFetch
|
|||||||
}
|
}
|
||||||
|
|
||||||
func fetchHandler(ingester content.Ingester, fetcher remotes.Fetcher, pt *ProgressTracker) images.HandlerFunc {
|
func fetchHandler(ingester content.Ingester, fetcher remotes.Fetcher, pt *ProgressTracker) images.HandlerFunc {
|
||||||
return func(ctx context.Context, desc ocispec.Descriptor) (subdescs []ocispec.Descriptor, err error) {
|
return func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
|
||||||
ctx = log.WithLogger(ctx, log.G(ctx).WithFields(log.Fields{
|
ctx = log.WithLogger(ctx, log.G(ctx).WithFields(log.Fields{
|
||||||
"digest": desc.Digest,
|
"digest": desc.Digest,
|
||||||
"mediatype": desc.MediaType,
|
"mediatype": desc.MediaType,
|
||||||
"size": desc.Size,
|
"size": desc.Size,
|
||||||
}))
|
}))
|
||||||
|
|
||||||
switch desc.MediaType {
|
if desc.MediaType == images.MediaTypeDockerSchema1Manifest {
|
||||||
case images.MediaTypeDockerSchema1Manifest:
|
|
||||||
return nil, fmt.Errorf("%v not supported", desc.MediaType)
|
return nil, fmt.Errorf("%v not supported", desc.MediaType)
|
||||||
default:
|
|
||||||
err := remotes.Fetch(ctx, ingester, fetcher, desc)
|
|
||||||
if errdefs.IsAlreadyExists(err) {
|
|
||||||
pt.MarkExists(desc)
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
|
err := remotes.Fetch(ctx, ingester, fetcher, desc)
|
||||||
|
if errdefs.IsAlreadyExists(err) {
|
||||||
|
pt.MarkExists(desc)
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -179,8 +179,7 @@ func (u *Unpacker) Unpack(h images.Handler) images.Handler {
|
|||||||
return children, err
|
return children, err
|
||||||
}
|
}
|
||||||
|
|
||||||
switch desc.MediaType {
|
if images.IsManifestType(desc.MediaType) {
|
||||||
case images.MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest:
|
|
||||||
var nonLayers []ocispec.Descriptor
|
var nonLayers []ocispec.Descriptor
|
||||||
var manifestLayers []ocispec.Descriptor
|
var manifestLayers []ocispec.Descriptor
|
||||||
// Split layers from non-layers, layers will be handled after
|
// Split layers from non-layers, layers will be handled after
|
||||||
@ -203,7 +202,7 @@ func (u *Unpacker) Unpack(h images.Handler) images.Handler {
|
|||||||
lock.Unlock()
|
lock.Unlock()
|
||||||
|
|
||||||
children = nonLayers
|
children = nonLayers
|
||||||
case images.MediaTypeDockerSchema2Config, ocispec.MediaTypeImageConfig:
|
} else if images.IsConfigType(desc.MediaType) {
|
||||||
lock.Lock()
|
lock.Lock()
|
||||||
l := layers[desc.Digest]
|
l := layers[desc.Digest]
|
||||||
lock.Unlock()
|
lock.Unlock()
|
||||||
|
@ -41,9 +41,7 @@ const LegacyConfigMediaType = "application/octet-stream"
|
|||||||
// 1. original manifest will be deleted by next gc round.
|
// 1. original manifest will be deleted by next gc round.
|
||||||
// 2. don't cover manifest list.
|
// 2. don't cover manifest list.
|
||||||
func ConvertManifest(ctx context.Context, store content.Store, desc ocispec.Descriptor) (ocispec.Descriptor, error) {
|
func ConvertManifest(ctx context.Context, store content.Store, desc ocispec.Descriptor) (ocispec.Descriptor, error) {
|
||||||
if !(desc.MediaType == images.MediaTypeDockerSchema2Manifest ||
|
if !images.IsManifestType(desc.MediaType) {
|
||||||
desc.MediaType == ocispec.MediaTypeImageManifest) {
|
|
||||||
|
|
||||||
log.G(ctx).Warnf("do nothing for media type: %s", desc.MediaType)
|
log.G(ctx).Warnf("do nothing for media type: %s", desc.MediaType)
|
||||||
return desc, nil
|
return desc, nil
|
||||||
}
|
}
|
||||||
|
@ -94,10 +94,8 @@ func (r dockerFetcher) Fetch(ctx context.Context, desc ocispec.Descriptor) (io.R
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Try manifests endpoints for manifests types
|
// Try manifests endpoints for manifests types
|
||||||
switch desc.MediaType {
|
if images.IsManifestType(desc.MediaType) || images.IsIndexType(desc.MediaType) ||
|
||||||
case images.MediaTypeDockerSchema2Manifest, images.MediaTypeDockerSchema2ManifestList,
|
desc.MediaType == images.MediaTypeDockerSchema1Manifest {
|
||||||
images.MediaTypeDockerSchema1Manifest,
|
|
||||||
ocispec.MediaTypeImageManifest, ocispec.MediaTypeImageIndex:
|
|
||||||
|
|
||||||
var firstErr error
|
var firstErr error
|
||||||
for _, host := range r.hosts {
|
for _, host := range r.hosts {
|
||||||
|
@ -103,12 +103,10 @@ func (p dockerPusher) push(ctx context.Context, desc ocispec.Descriptor, ref str
|
|||||||
host = hosts[0]
|
host = hosts[0]
|
||||||
)
|
)
|
||||||
|
|
||||||
switch desc.MediaType {
|
if images.IsManifestType(desc.MediaType) || images.IsIndexType(desc.MediaType) {
|
||||||
case images.MediaTypeDockerSchema2Manifest, images.MediaTypeDockerSchema2ManifestList,
|
|
||||||
ocispec.MediaTypeImageManifest, ocispec.MediaTypeImageIndex:
|
|
||||||
isManifest = true
|
isManifest = true
|
||||||
existCheck = getManifestPath(p.object, desc.Digest)
|
existCheck = getManifestPath(p.object, desc.Digest)
|
||||||
default:
|
} else {
|
||||||
existCheck = []string{"blobs", desc.Digest.String()}
|
existCheck = []string{"blobs", desc.Digest.String()}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,17 +71,17 @@ func MakeRefKey(ctx context.Context, desc ocispec.Descriptor) string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch mt := desc.MediaType; {
|
switch {
|
||||||
case mt == images.MediaTypeDockerSchema2Manifest || mt == ocispec.MediaTypeImageManifest:
|
case images.IsManifestType(desc.MediaType):
|
||||||
return "manifest-" + key
|
return "manifest-" + key
|
||||||
case mt == images.MediaTypeDockerSchema2ManifestList || mt == ocispec.MediaTypeImageIndex:
|
case images.IsIndexType(desc.MediaType):
|
||||||
return "index-" + key
|
return "index-" + key
|
||||||
case images.IsLayerType(mt):
|
case images.IsLayerType(desc.MediaType):
|
||||||
return "layer-" + key
|
return "layer-" + key
|
||||||
case images.IsKnownConfig(mt):
|
case images.IsKnownConfig(desc.MediaType):
|
||||||
return "config-" + key
|
return "config-" + key
|
||||||
default:
|
default:
|
||||||
log.G(ctx).Warnf("reference for unknown type: %s", mt)
|
log.G(ctx).Warnf("reference for unknown type: %s", desc.MediaType)
|
||||||
return "unknown-" + key
|
return "unknown-" + key
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -90,23 +90,21 @@ func MakeRefKey(ctx context.Context, desc ocispec.Descriptor) string {
|
|||||||
// discovered in a call to Dispatch. Use with ChildrenHandler to do a full
|
// discovered in a call to Dispatch. Use with ChildrenHandler to do a full
|
||||||
// recursive fetch.
|
// recursive fetch.
|
||||||
func FetchHandler(ingester content.Ingester, fetcher Fetcher) images.HandlerFunc {
|
func FetchHandler(ingester content.Ingester, fetcher Fetcher) images.HandlerFunc {
|
||||||
return func(ctx context.Context, desc ocispec.Descriptor) (subdescs []ocispec.Descriptor, err error) {
|
return func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
|
||||||
ctx = log.WithLogger(ctx, log.G(ctx).WithFields(log.Fields{
|
ctx = log.WithLogger(ctx, log.G(ctx).WithFields(log.Fields{
|
||||||
"digest": desc.Digest,
|
"digest": desc.Digest,
|
||||||
"mediatype": desc.MediaType,
|
"mediatype": desc.MediaType,
|
||||||
"size": desc.Size,
|
"size": desc.Size,
|
||||||
}))
|
}))
|
||||||
|
|
||||||
switch desc.MediaType {
|
if desc.MediaType == images.MediaTypeDockerSchema1Manifest {
|
||||||
case images.MediaTypeDockerSchema1Manifest:
|
|
||||||
return nil, fmt.Errorf("%v not supported", desc.MediaType)
|
return nil, fmt.Errorf("%v not supported", desc.MediaType)
|
||||||
default:
|
|
||||||
err := Fetch(ctx, ingester, fetcher, desc)
|
|
||||||
if errdefs.IsAlreadyExists(err) {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
|
err := Fetch(ctx, ingester, fetcher, desc)
|
||||||
|
if errdefs.IsAlreadyExists(err) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,20 +212,18 @@ func PushContent(ctx context.Context, pusher Pusher, desc ocispec.Descriptor, st
|
|||||||
indexStack := []ocispec.Descriptor{}
|
indexStack := []ocispec.Descriptor{}
|
||||||
|
|
||||||
filterHandler := images.HandlerFunc(func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
|
filterHandler := images.HandlerFunc(func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
|
||||||
switch desc.MediaType {
|
if images.IsManifestType(desc.MediaType) {
|
||||||
case images.MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest:
|
|
||||||
m.Lock()
|
m.Lock()
|
||||||
manifests = append(manifests, desc)
|
manifests = append(manifests, desc)
|
||||||
m.Unlock()
|
m.Unlock()
|
||||||
return nil, images.ErrStopHandler
|
return nil, images.ErrStopHandler
|
||||||
case images.MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex:
|
} else if images.IsIndexType(desc.MediaType) {
|
||||||
m.Lock()
|
m.Lock()
|
||||||
indexStack = append(indexStack, desc)
|
indexStack = append(indexStack, desc)
|
||||||
m.Unlock()
|
m.Unlock()
|
||||||
return nil, images.ErrStopHandler
|
return nil, images.ErrStopHandler
|
||||||
default:
|
|
||||||
return nil, nil
|
|
||||||
}
|
}
|
||||||
|
return nil, nil
|
||||||
})
|
})
|
||||||
|
|
||||||
pushHandler := PushHandler(pusher, store)
|
pushHandler := PushHandler(pusher, store)
|
||||||
@ -318,24 +314,16 @@ func FilterManifestByPlatformHandler(f images.HandlerFunc, m platforms.Matcher)
|
|||||||
return children, nil
|
return children, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var descs []ocispec.Descriptor
|
if images.IsManifestType(desc.MediaType) && !m.Match(*desc.Platform) {
|
||||||
switch desc.MediaType {
|
var descs []ocispec.Descriptor
|
||||||
case images.MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest:
|
for _, child := range children {
|
||||||
if m.Match(*desc.Platform) {
|
if images.IsConfigType(child.MediaType) {
|
||||||
descs = children
|
descs = append(descs, child)
|
||||||
} else {
|
|
||||||
for _, child := range children {
|
|
||||||
if child.MediaType == images.MediaTypeDockerSchema2Config ||
|
|
||||||
child.MediaType == ocispec.MediaTypeImageConfig {
|
|
||||||
|
|
||||||
descs = append(descs, child)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
default:
|
return descs, nil
|
||||||
descs = children
|
|
||||||
}
|
}
|
||||||
return descs, nil
|
return children, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -350,10 +338,7 @@ func annotateDistributionSourceHandler(f images.HandlerFunc, provider content.In
|
|||||||
|
|
||||||
// Distribution source is only used for config or blob but may be inherited from
|
// Distribution source is only used for config or blob but may be inherited from
|
||||||
// a manifest or manifest list
|
// a manifest or manifest list
|
||||||
switch desc.MediaType {
|
if !images.IsManifestType(desc.MediaType) && !images.IsIndexType(desc.MediaType) {
|
||||||
case images.MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest,
|
|
||||||
images.MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex:
|
|
||||||
default:
|
|
||||||
return children, nil
|
return children, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
25
signals.go
25
signals.go
@ -57,25 +57,24 @@ func GetOCIStopSignal(ctx context.Context, image Image, defaultSignal string) (s
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
if !images.IsConfigType(ic.MediaType) {
|
||||||
|
return "", fmt.Errorf("unknown image config media type %s", ic.MediaType)
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
ociimage v1.Image
|
ociimage v1.Image
|
||||||
config v1.ImageConfig
|
config v1.ImageConfig
|
||||||
)
|
)
|
||||||
switch ic.MediaType {
|
p, err := content.ReadBlob(ctx, image.ContentStore(), ic)
|
||||||
case v1.MediaTypeImageConfig, images.MediaTypeDockerSchema2Config:
|
if err != nil {
|
||||||
p, err := content.ReadBlob(ctx, image.ContentStore(), ic)
|
return "", err
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := json.Unmarshal(p, &ociimage); err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
config = ociimage.Config
|
|
||||||
default:
|
|
||||||
return "", fmt.Errorf("unknown image config media type %s", ic.MediaType)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err = json.Unmarshal(p, &ociimage); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
config = ociimage.Config
|
||||||
|
|
||||||
if config.StopSignal == "" {
|
if config.StopSignal == "" {
|
||||||
return defaultSignal, nil
|
return defaultSignal, nil
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user