Skip to content

Commit 29c777f

Browse files
authored
Merge pull request #20 from evgenyz/fix-image-docker-local
Fix local container image layer implementation
2 parents 4811d0f + d11a51a commit 29c777f

File tree

1 file changed

+47
-14
lines changed

1 file changed

+47
-14
lines changed

image/docker.go

Lines changed: 47 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"strings"
1212

1313
"github.com/quay/claircore"
14+
"github.com/quay/zlog"
1415
)
1516

1617
var _ Image = (*dockerLocalImage)(nil)
@@ -42,24 +43,36 @@ func NewDockerLocalImage(ctx context.Context, exportDir string, importDir string
4243
hdr, err := tr.Next()
4344
for ; err == nil; hdr, err = tr.Next() {
4445
dir, fn := filepath.Split(hdr.Name)
45-
if fn == "layer.tar" {
4646

47-
sha := filepath.Base(dir)
47+
if strings.HasSuffix(fn, ".tar") {
48+
layerFilePath := ""
49+
50+
if fn == "layer.tar" {
51+
if hdr.Linkname == "" && hdr.Size > 0 {
52+
sha := filepath.Base(dir)
53+
layerFilePath = filepath.Join(importDir, "sha256:"+sha)
54+
} else {
55+
continue
56+
}
57+
} else {
58+
sha := strings.TrimSuffix(fn, filepath.Ext(fn))
59+
layerFilePath = filepath.Join(importDir, "sha256:"+sha)
60+
}
61+
62+
zlog.Debug(ctx).Str("layerFilePath", layerFilePath).Msg("found .tar file")
4863

49-
layerFilePath := filepath.Join(importDir, "sha256:"+sha)
5064
layerFile, err := os.OpenFile(layerFilePath, os.O_CREATE|os.O_RDWR, os.FileMode(0600))
5165
if err != nil {
5266
return nil, err
5367
}
54-
5568
_, err = io.Copy(layerFile, tr)
5669
if err != nil {
5770
return nil, err
5871
}
59-
6072
di.layerPaths = append(di.layerPaths, layerFile.Name())
6173
layerFile.Close()
6274
}
75+
6376
if fn == "manifest.json" {
6477
_m := []*imageInfo{}
6578
b, err := io.ReadAll(tr)
@@ -72,50 +85,70 @@ func NewDockerLocalImage(ctx context.Context, exportDir string, importDir string
7285
}
7386
m = _m[0]
7487
digest := strings.TrimSuffix(m.Config, filepath.Ext(m.Config))
88+
zlog.Debug(ctx).Str("digest", digest)
7589
di.imageDigest = "sha256:" + digest
7690
}
7791
}
7892

7993
var sortedPaths []string
94+
zlog.Debug(ctx).Any("m.Layers", m.Layers)
95+
zlog.Debug(ctx).Any("di.layerPaths", di.layerPaths)
96+
8097
for _, p := range m.Layers {
98+
zlog.Debug(ctx).Str("p", p)
8199
for _, l := range di.layerPaths {
100+
zlog.Debug(ctx).Str("p", p).Str("l", l).Msg("lps")
82101
if filepath.Dir(p) == strings.TrimPrefix(filepath.Base(l), "sha256:") {
83102
sortedPaths = append(sortedPaths, l)
84103
}
104+
if strings.TrimSuffix(p, filepath.Ext(p)) == strings.TrimPrefix(filepath.Base(l), "sha256:") {
105+
sortedPaths = append(sortedPaths, l)
106+
}
85107
}
86108
}
109+
zlog.Debug(ctx).Any("sortedPaths", sortedPaths).Msg("layers")
87110
di.layerPaths = sortedPaths
88111
return di, nil
89112
}
90113

91-
func (i *dockerLocalImage) getLayers() ([]*claircore.Layer, error) {
114+
func (i *dockerLocalImage) getLayers(ctx context.Context) ([]*claircore.Layer, error) {
92115
if len(i.layerPaths) == 0 {
93116
return nil, nil
94117
}
95118
layers := []*claircore.Layer{}
96119
for _, layerStr := range i.layerPaths {
97-
98120
_, d := filepath.Split(layerStr)
99-
hash, err := claircore.ParseDigest(d)
121+
122+
desc := &claircore.LayerDescription{
123+
Digest: d,
124+
URI: layerStr,
125+
MediaType: "application/vnd.oci.image.layer.v1.tar",
126+
}
127+
128+
l := &claircore.Layer{}
129+
f, err := os.OpenFile(layerStr, os.O_RDONLY, os.FileMode(0600))
100130
if err != nil {
101-
return nil, err
131+
zlog.Error(ctx).Err(err)
102132
}
103-
l := &claircore.Layer{
104-
Hash: hash,
105-
URI: layerStr,
133+
err = l.Init(ctx, desc, f)
134+
if err != nil {
135+
zlog.Error(ctx).Err(err)
106136
}
137+
107138
layers = append(layers, l)
139+
140+
l.Close()
108141
}
109142
return layers, nil
110143
}
111144

112-
func (i *dockerLocalImage) GetManifest(_ context.Context) (*claircore.Manifest, error) {
145+
func (i *dockerLocalImage) GetManifest(ctx context.Context) (*claircore.Manifest, error) {
113146
digest, err := claircore.ParseDigest(i.imageDigest)
114147
if err != nil {
115148
return nil, err
116149
}
117150

118-
layers, err := i.getLayers()
151+
layers, err := i.getLayers(ctx)
119152
if err != nil {
120153
return nil, err
121154
}

0 commit comments

Comments
 (0)