81 lines
1.7 KiB
Go
81 lines
1.7 KiB
Go
package image
|
|
|
|
import (
|
|
"io"
|
|
|
|
"github.com/docker/docker/client"
|
|
"github.com/wagoodman/dive/filetree"
|
|
)
|
|
|
|
type Parser interface {
|
|
}
|
|
|
|
type Analyzer interface {
|
|
Fetch() (io.ReadCloser, error)
|
|
Parse(io.ReadCloser) error
|
|
Analyze() (*AnalysisResult, error)
|
|
}
|
|
|
|
type Layer interface {
|
|
Id() string
|
|
ShortId() string
|
|
Index() int
|
|
Command() string
|
|
Size() uint64
|
|
Tree() *filetree.FileTree
|
|
String() string
|
|
}
|
|
|
|
type AnalysisResult struct {
|
|
Layers []Layer
|
|
RefTrees []*filetree.FileTree
|
|
Efficiency float64
|
|
SizeBytes uint64
|
|
UserSizeByes uint64 // this is all bytes except for the base image
|
|
WastedUserPercent float64 // = wasted-bytes/user-size-bytes
|
|
WastedBytes uint64
|
|
Inefficiencies filetree.EfficiencySlice
|
|
}
|
|
|
|
type dockerImageAnalyzer struct {
|
|
id string
|
|
client *client.Client
|
|
jsonFiles map[string][]byte
|
|
trees []*filetree.FileTree
|
|
layerMap map[string]*filetree.FileTree
|
|
layers []*dockerLayer
|
|
}
|
|
|
|
type dockerImageHistoryEntry struct {
|
|
ID string
|
|
Size uint64
|
|
Created string `json:"created"`
|
|
Author string `json:"author"`
|
|
CreatedBy string `json:"created_by"`
|
|
EmptyLayer bool `json:"empty_layer"`
|
|
}
|
|
|
|
type dockerImageManifest struct {
|
|
ConfigPath string `json:"Config"`
|
|
RepoTags []string `json:"RepoTags"`
|
|
LayerTarPaths []string `json:"Layers"`
|
|
}
|
|
|
|
type dockerImageConfig struct {
|
|
History []dockerImageHistoryEntry `json:"history"`
|
|
RootFs dockerRootFs `json:"rootfs"`
|
|
}
|
|
|
|
type dockerRootFs struct {
|
|
Type string `json:"type"`
|
|
DiffIds []string `json:"diff_ids"`
|
|
}
|
|
|
|
// Layer represents a Docker image layer and metadata
|
|
type dockerLayer struct {
|
|
tarPath string
|
|
history dockerImageHistoryEntry
|
|
index int
|
|
tree *filetree.FileTree
|
|
}
|