@@ -25,6 +25,7 @@ import (
25
25
"path/filepath"
26
26
"sort"
27
27
"strings"
28
+ "time"
28
29
29
30
"github.com/google/go-containerregistry/authn"
30
31
"github.com/google/go-containerregistry/name"
@@ -129,14 +130,17 @@ func checkIfValidAnalyzer(_ []string) error {
129
130
}
130
131
131
132
func getImageForName (imageName string ) (pkgutil.Image , error ) {
132
- logrus .Infof ("getting image for name %s" , imageName )
133
+ logrus .Infof ("retrieving image: %s" , imageName )
133
134
var img v1.Image
134
135
var err error
135
136
if pkgutil .IsTar (imageName ) {
137
+ start := time .Now ()
136
138
img , err = tarball .ImageFromPath (imageName , nil )
137
139
if err != nil {
138
140
return pkgutil.Image {}, err
139
141
}
142
+ elapsed := time .Now ().Sub (start )
143
+ logrus .Infof ("retrieving image from tar took %f seconds" , elapsed .Seconds ())
140
144
}
141
145
142
146
if strings .HasPrefix (imageName , DaemonPrefix ) {
@@ -148,10 +152,15 @@ func getImageForName(imageName string) (pkgutil.Image, error) {
148
152
return pkgutil.Image {}, err
149
153
}
150
154
151
- img , err = daemon .Image (ref , & daemon.ReadOptions {})
155
+ start := time .Now ()
156
+ img , err = daemon .Image (ref , & daemon.ReadOptions {
157
+ Buffer : true ,
158
+ })
152
159
if err != nil {
153
160
return pkgutil.Image {}, err
154
161
}
162
+ elapsed := time .Now ().Sub (start )
163
+ logrus .Infof ("retrieving image from daemon took %f seconds" , elapsed .Seconds ())
155
164
} else {
156
165
// either has remote prefix or has no prefix, in which case we force remote
157
166
imageName = strings .Replace (imageName , RemotePrefix , "" , - 1 )
@@ -163,21 +172,28 @@ func getImageForName(imageName string) (pkgutil.Image, error) {
163
172
if err != nil {
164
173
return pkgutil.Image {}, err
165
174
}
175
+ start := time .Now ()
166
176
img , err = remote .Image (ref , auth , http .DefaultTransport )
167
177
if err != nil {
168
178
return pkgutil.Image {}, err
169
179
}
180
+ elapsed := time .Now ().Sub (start )
181
+ logrus .Infof ("retrieving remote image took %f seconds" , elapsed .Seconds ())
170
182
}
171
183
172
184
// create tempdir and extract fs into it
173
185
var layers []pkgutil.Layer
174
186
if includeLayers () {
187
+ start := time .Now ()
175
188
imgLayers , err := img .Layers ()
176
189
if err != nil {
177
190
return pkgutil.Image {}, err
178
191
}
179
192
for _ , layer := range imgLayers {
180
- path , err := ioutil .TempDir ("" , strings .Replace (imageName , "/" , "" , - 1 ))
193
+ layerStart := time .Now ()
194
+ diffID , err := layer .DiffID ()
195
+ logrus .Infof ("layer digest: %s" , diffID .String ())
196
+ path , err := getExtractPathForName (diffID .String ())
181
197
if err != nil {
182
198
return pkgutil.Image {
183
199
Layers : layers ,
@@ -191,43 +207,53 @@ func getImageForName(imageName string) (pkgutil.Image, error) {
191
207
layers = append (layers , pkgutil.Layer {
192
208
FSPath : path ,
193
209
})
210
+ elapsed := time .Now ().Sub (layerStart )
211
+ logrus .Infof ("time elapsed retrieving layer: %fs" , elapsed .Seconds ())
194
212
}
213
+ elapsed := time .Now ().Sub (start )
214
+ logrus .Infof ("time elapsed retrieving image layers: %fs" , elapsed .Seconds ())
195
215
}
196
216
217
+ path , err := getExtractPathForName (imageName )
218
+ // extract fs into provided dir
219
+ if err := pkgutil .GetFileSystemForImage (img , path , nil ); err != nil {
220
+ return pkgutil.Image {
221
+ FSPath : path ,
222
+ Layers : layers ,
223
+ }, err
224
+ }
225
+ return pkgutil.Image {
226
+ Image : img ,
227
+ Source : imageName ,
228
+ FSPath : path ,
229
+ Layers : layers ,
230
+ }, nil
231
+ }
232
+
233
+ func getExtractPathForName (name string ) (string , error ) {
197
234
var path string
235
+ var err error
198
236
if ! noCache {
199
- path , err = cacheDir (imageName )
237
+ path , err = cacheDir (name )
200
238
if err != nil {
201
- return pkgutil. Image {} , err
239
+ return "" , err
202
240
}
203
241
// if cachedir doesn't exist, create it
204
242
if _ , err := os .Stat (path ); err != nil && os .IsNotExist (err ) {
205
243
err = os .MkdirAll (path , 0700 )
206
244
if err != nil {
207
- return pkgutil. Image {} , err
245
+ return "" , err
208
246
}
209
247
logrus .Infof ("Image fs cached at %s" , path )
210
248
}
211
249
} else {
212
250
// otherwise, create tempdir
213
- path , err = ioutil .TempDir ("" , strings .Replace (imageName , "/" , "" , - 1 ))
251
+ path , err = ioutil .TempDir ("" , strings .Replace (name , "/" , "" , - 1 ))
214
252
if err != nil {
215
- return pkgutil. Image {} , err
253
+ return "" , err
216
254
}
217
255
}
218
- // extract fs into provided dir
219
- if err := pkgutil .GetFileSystemForImage (img , path , nil ); err != nil {
220
- return pkgutil.Image {
221
- FSPath : path ,
222
- Layers : layers ,
223
- }, err
224
- }
225
- return pkgutil.Image {
226
- Image : img ,
227
- Source : imageName ,
228
- FSPath : path ,
229
- Layers : layers ,
230
- }, nil
256
+ return path , nil
231
257
}
232
258
233
259
func includeLayers () bool {
0 commit comments