Documentation
¶
Index ¶
Constants ¶
const ( // MediaTypeLayerTOC is the media type for chunked layer TOC blobs. MediaTypeLayerTOC = "application/vnd.oci.image.layer.toc.v1+json" // OriginalDigestAnnotation is the annotation key for the original layer digest. OriginalDigestAnnotation = "org.opencontainers.image.layer.original-digest" // UncompressedSizeAnnotation is the annotation key for the total uncompressed // size of all regular files in the layer, in bytes. UncompressedSizeAnnotation = "org.opencontainers.image.layer.uncompressed-size" )
const ( // SmallFileThreshold is the maximum file size eligible for tar compaction. // Files smaller than this are aggregated into a single compressed tar blob. SmallFileThreshold = 1 << 20 // 1 MiB )
Variables ¶
This section is empty.
Functions ¶
func ConvertLayer ¶
func ConvertLayer(ctx context.Context, data []byte, mediaType string, progress Progress) (*TOC, []Blob, error)
ConvertLayer converts a compressed layer to chunked format, collecting all chunk blobs in memory. Duplicate blobs are deduplicated by digest. For streaming conversions (e.g. pushing directly to a blob store), use ConvertLayerToChunked with a custom blobPusher instead. If progress is nil, progress events are discarded.
Types ¶
type Progress ¶ added in v0.1.1
type Progress interface {
// ConvertingLayer is called once when layer decompression begins.
ConvertingLayer(mediaType string, compressedBytes int64)
// LargeFile is called for each file ≥ SmallFileThreshold that becomes its own blob.
LargeFile(name string, size int64, digest digest.Digest)
// CompactTar is called after the small-files tar blob is created.
CompactTar(fileCount int, uncompressedBytes int64, compressedBytes int64, digest digest.Digest)
// Done is called when conversion is complete.
Done(totalEntries int, largeFiles int, smallFiles int, hardlinks int)
}
Progress receives conversion progress events. Implementations must be safe for use from a single goroutine (no concurrent calls are made).
type TOC ¶
TOC is the top-level table of contents for a chunked layer.
func ConvertLayerToChunked ¶
func ConvertLayerToChunked(ctx context.Context, compressedData []byte, mediaType string, blobPusher func(ctx context.Context, data []byte) (digest.Digest, error), progress Progress) (*TOC, error)
ConvertLayerToChunked decompresses a gzip or zstd tar layer and converts it to the chunked format. Large files (≥ SmallFileThreshold) become individual chunk blobs. Small files are aggregated into a single zstd-compressed tar blob appended at the end of the TOC.
blobPusher is called for each blob to store; it must return the blob's digest. If progress is nil, progress events are discarded. Returns the completed TOC.
func (*TOC) ChunkDigests ¶
ChunkDigests returns all blob digests that must exist for this TOC to be valid. For "reg" entries: the file digest (or per-chunk digests for multi-chunk files). For "tar" entries: the compressed blob digest (or uncompressed digest if no compression).
func (*TOC) UncompressedSize ¶
UncompressedSize returns the total uncompressed size of all file content in the TOC.
type TOCChunk ¶
type TOCChunk struct {
// Digest is the content-addressed digest of this chunk blob.
Digest digest.Digest `json:"digest"`
// Size is the byte length of this chunk.
Size int64 `json:"size"`
}
TOCChunk describes one chunk blob of a multi-chunk regular file.
type TOCEntry ¶
type TOCEntry struct {
// Type is the entry type: "reg", "dir", "symlink", "hardlink", "char", "block",
// "fifo", "whiteout", "opaque", "tar".
Type string `json:"type"`
// Name is the path of the entry within the layer. Not present for "tar" entries.
Name string `json:"name,omitempty"`
// Size is the uncompressed size in bytes. For "reg" entries, the file size.
// For "tar" entries without compression, the tar blob size.
// For "tar" entries with compression, the compressed blob size.
Size int64 `json:"size,omitempty"`
// Mode is the file mode and permission bits.
Mode uint32 `json:"mode,omitempty"`
// UID is the numeric user ID of the owner.
UID int `json:"uid,omitempty"`
// GID is the numeric group ID of the owner.
GID int `json:"gid,omitempty"`
// Uname is the user name of the owner.
Uname string `json:"uname,omitempty"`
// Gname is the group name of the owner.
Gname string `json:"gname,omitempty"`
// ModTime is the modification time of the entry.
ModTime time.Time `json:"modtime,omitempty"`
// LinkName is the target of a symlink or the source name of a hardlink.
LinkName string `json:"linkName,omitempty"`
// DevMajor is the major device number for char/block device entries.
DevMajor int64 `json:"devMajor,omitempty"`
// DevMinor is the minor device number for char/block device entries.
DevMinor int64 `json:"devMinor,omitempty"`
// Xattrs holds extended attributes for the entry.
Xattrs map[string][]byte `json:"xattrs,omitempty"`
// Digest is the content-addressed digest of the uncompressed content.
// For "reg" entries: digest of the file content (also the blob digest for single-chunk files).
// For "tar" entries: digest of the uncompressed tar blob (used for local dedup).
Digest digest.Digest `json:"digest,omitempty"`
// Chunks holds chunk descriptors when a file is split across multiple chunk blobs.
Chunks []TOCChunk `json:"chunks,omitempty"`
// Description is an informational string for "tar" entries (e.g., directory subtree
// covered). Not used for extraction.
Description string `json:"description,omitempty"`
// Compression is the compression algorithm for "tar" entries (e.g., "zstd").
// If absent, the tar blob is stored uncompressed.
Compression string `json:"compression,omitempty"`
// CompressedDigest is the digest of the compressed tar blob in the registry.
// This is the blob digest used for fetching. Only present when Compression is set.
CompressedDigest digest.Digest `json:"compressedDigest,omitempty"`
// UncompressedSize is the uncompressed size of the tar blob in bytes.
// Only present for "tar" entries when Compression is set.
// When set, Size refers to the compressed size.
UncompressedSize int64 `json:"uncompressedSize,omitempty"`
}
TOCEntry represents a single entry in the chunked layer TOC.