@@ -11,6 +11,7 @@ import (
1111 "strings"
1212
1313 "github.com/quay/claircore"
14+ "github.com/quay/zlog"
1415)
1516
1617var _ 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