14
14
15
15
repository/image-name:version
16
16
17
- Main project will be named "Docker_repository /image-name" and will have "version" as a version
17
+ Main project will be named "repository /image-name" and will have "version" as a version
18
18
19
- Docker Inspector scan project will be named as DI_ "repository/image-name" and will have "version" as a version
19
+ Docker Inspector scan project on squashed imaged will be named as "repository/image-name"_squashed and will have "version" as a version
20
20
21
21
Sub-projects for layers will be named as
22
22
repository/image-name_layer_1
@@ -165,12 +165,11 @@ def detect_inspector_run(self, options=['--help']):
165
165
166
166
class ContainerImageScanner ():
167
167
168
- def __init__ (self , hub , container_image_name , proj_name , workdir = '/tmp/workdir' , dockerfile = None , base_image = None , omit_base_layers = False ):
168
+ def __init__ (self , hub , container_image_name , workdir = '/tmp/workdir' , dockerfile = None , base_image = None , omit_base_layers = False ):
169
169
self .hub = hub
170
170
self .hub_detect = Detector (hub )
171
171
self .docker = DockerWrapper (workdir )
172
172
self .container_image_name = container_image_name
173
- self .proj_name = proj_name
174
173
cindex = container_image_name .rfind (':' )
175
174
if cindex == - 1 :
176
175
self .image_name = container_image_name
@@ -199,7 +198,7 @@ def process_container_image(self):
199
198
offset = 0
200
199
for i in self .manifest [0 ]['Layers' ]:
201
200
layer = {}
202
- layer ['name' ] = self .proj_name + "_layer_" + str (num )
201
+ layer ['name' ] = self .image_name + "_layer_" + str (num )
203
202
layer ['path' ] = i
204
203
while self .config ['history' ][num + offset - 1 ].get ('empty_layer' , False ):
205
204
offset = offset + 1
@@ -210,7 +209,7 @@ def process_container_image(self):
210
209
print (json .dumps (self .layers , indent = 4 ))
211
210
212
211
def generate_project_structures (self , base_layers = None ):
213
- main_project_release = self .hub .get_or_create_project_version ("Docker_" + self .proj_name , self .image_version )
212
+ main_project_release = self .hub .get_or_create_project_version (self .image_name , self .image_version )
214
213
215
214
for layer in self .layers :
216
215
parameters = {}
@@ -234,17 +233,15 @@ def generate_project_structures(self, base_layers=None):
234
233
print ("Number of addon layers {}" .format (len (addon )))
235
234
236
235
if (len (base ) > 0 ):
237
- main_project_release_addon = self .hub .get_or_create_project_version (self .proj_name , addon_image_version )
236
+ main_project_release_addon = self .hub .get_or_create_project_version (self .image_name , addon_image_version )
238
237
if not self .omit_base_layers :
239
- main_project_release_base = self .hub .get_or_create_project_version (self .proj_name , base_image_version )
238
+ main_project_release_base = self .hub .get_or_create_project_version (self .image_name , base_image_version )
240
239
for layer in base :
241
- parameters = {}
242
- parameters ['description' ] = layer ['command' ]['created_by' ]
240
+ parameters = {'description' : layer ['command' ]['created_by' ]}
243
241
sub_project_release = self .hub .get_or_create_project_version (layer ['name' ], self .image_version , parameters = parameters )
244
242
self .hub .add_version_as_component (main_project_release_base , sub_project_release )
245
243
for layer in addon :
246
- parameters = {}
247
- parameters ['description' ] = layer ['command' ]['created_by' ]
244
+ parameters = {'description' : layer ['command' ]['created_by' ]}
248
245
sub_project_release = self .hub .get_or_create_project_version (layer ['name' ], self .image_version , parameters = parameters )
249
246
self .hub .add_version_as_component (main_project_release_addon , sub_project_release )
250
247
else :
@@ -255,7 +252,7 @@ def generate_project_structures(self, base_layers=None):
255
252
print ("************************************************************" )
256
253
257
254
def generate_single_layer_project_structure (self , layer_number ):
258
- main_project_release = self .hub .get_or_create_project_version ("Docker_" + self .proj_name , self .image_version )
255
+ main_project_release = self .hub .get_or_create_project_version (self .image_name , self .image_version )
259
256
260
257
layer = self .layers [layer_number - 1 ]
261
258
parameters = {}
@@ -284,20 +281,20 @@ def submit_single_layer_scan(self, layer_number):
284
281
self .hub_detect .detect_run (options )
285
282
286
283
def submit_docker_inspector_scan (self ):
287
- main_project_release = self .hub .get_or_create_project_version ("Docker_" + self .proj_name , self .image_version )
288
- sub_project_release = self .hub .get_or_create_project_version ('DI_{}' . format ( self .proj_name ) , self .image_version )
284
+ main_project_release = self .hub .get_or_create_project_version (self .image_name , self .image_version )
285
+ sub_project_release = self .hub .get_or_create_project_version (self .image_name + "_squashed" , self .image_version )
289
286
self .hub .add_version_as_component (main_project_release , sub_project_release )
290
- options = []
291
- options .append ('--detect.project.name=DI_{}' .format (self .proj_name ))
292
- options .append ('--detect.project.version.name="{}"' .format (self .image_version ))
293
- options .append ('--detect.code.location.name=DI_{}' .format (self .docker .imagefile ))
294
- options .append ('--detect.docker.tar={}' .format (self .docker .imagefile ))
287
+ options = ['--detect.project.name={}_squashed' .format (self .image_name ),
288
+ '--detect.project.version.name="{}"' .format (self .image_version ),
289
+ '--detect.code.location.name=DI_{}' .format (self .docker .imagefile ),
290
+ '--detect.docker.tar={}' .format (self .docker .imagefile )]
295
291
self .hub_detect .detect_inspector_run (options )
296
292
297
293
def cleanup_project_structure (self ):
298
- release = self .hub .get_or_create_project_version (self .proj_name ,self .image_version )
299
- base_release = self .hub .get_project_version_by_name (self .proj_name ,self .image_version + "__base_layers" )
300
- addon_release = self .hub .get_project_version_by_name (self .proj_name ,self .image_version + "_addon_layers" )
294
+ release = self .hub .get_or_create_project_version (self .image_name ,self .image_version )
295
+ base_release = self .hub .get_project_version_by_name (self .image_name ,self .image_version + "__base_layers" )
296
+ addon_release = self .hub .get_project_version_by_name (self .image_name ,self .image_version + "_addon_layers" )
297
+ squahed_release = self .hub .get_project_version_by_name (self .image_name ,self .image_version + "_squashed" )
301
298
302
299
print ("--------" )
303
300
print (base_release )
@@ -324,15 +321,17 @@ def cleanup_project_structure(self):
324
321
print (self .hub .delete_project_version_by_name (sub_name , sub_version_name ))
325
322
326
323
if base_release :
327
- print (self .hub .delete_project_version_by_name (self .proj_name ,self .image_version + "__base_layers" ))
324
+ print (self .hub .delete_project_version_by_name (self .image_name ,self .image_version + "__base_layers" ))
328
325
if addon_release :
329
- print (self .hub .delete_project_version_by_name (self .proj_name ,self .image_version + "_addon_layers" ))
330
- project = self .hub .get_project_by_name (self .proj_name )
326
+ print (self .hub .delete_project_version_by_name (self .image_name ,self .image_version + "_addon_layers" ))
327
+ if squahed_release :
328
+ print (self .hub .delete_project_version_by_name (self .image_name , self .image_version + "_squashed" ))
329
+ project = self .hub .get_project_by_name (self .image_name )
331
330
versions = self .hub .get_project_versions (project )
332
331
if versions ['totalCount' ] == 1 :
333
- print (self .hub .delete_project_by_name (self .proj_name ))
332
+ print (self .hub .delete_project_by_name (self .image_name ))
334
333
else :
335
- print (self .hub .delete_project_version_by_name (self .proj_name ,self .image_version ))
334
+ print (self .hub .delete_project_version_by_name (self .image_name ,self .image_version ))
336
335
337
336
def get_base_layers (self ):
338
337
if (not self .dockerfile )and (not self .base_image ):
@@ -370,10 +369,10 @@ def get_base_layers(self):
370
369
return base_layers
371
370
372
371
373
- def scan_container_image (imagespec , projname , layer_number = 0 ):
372
+ def scan_container_image (imagespec , layer_number = 0 ):
374
373
375
374
hub = HubInstance ()
376
- scanner = ContainerImageScanner (hub , imagespec , projname )
375
+ scanner = ContainerImageScanner (hub , imagespec )
377
376
scanner .prepare_container_image ()
378
377
scanner .process_container_image ()
379
378
if layer_number == 0 :
@@ -382,23 +381,30 @@ def scan_container_image(imagespec, projname, layer_number=0):
382
381
else :
383
382
scanner .generate_single_layer_project_structure (layer_number )
384
383
scanner .submit_single_layer_scan (int (layer_number ))
384
+
385
+
386
+ def scan_squashed_image (imagespec ) :
387
+ hub = HubInstance ()
388
+ scanner = ContainerImageScanner (hub , imagespec )
389
+ scanner .prepare_container_image ()
385
390
scanner .submit_docker_inspector_scan ()
386
391
387
- def scan_container_image_with_dockerfile (imagespec , projname , dockerfile , base_image , omit_base_layers ):
392
+
393
+ def scan_container_image_with_dockerfile (imagespec , dockerfile , base_image , omit_base_layers ):
388
394
hub = HubInstance ()
389
- scanner = ContainerImageScanner (hub , imagespec , projname , dockerfile = dockerfile , base_image = base_image , omit_base_layers = omit_base_layers )
395
+ scanner = ContainerImageScanner (hub , imagespec , dockerfile = dockerfile , base_image = base_image , omit_base_layers = omit_base_layers )
390
396
base_layers = scanner .get_base_layers ()
391
397
print (json .dumps (base_layers , indent = 2 ))
392
398
# sys.exit()
393
399
scanner .prepare_container_image ()
394
400
scanner .process_container_image ()
395
401
scanner .generate_project_structures (base_layers )
396
402
scanner .submit_layer_scans ()
397
- scanner . submit_docker_inspector_scan ()
398
-
399
- def clean_container_project (imagespec , projname ):
403
+
404
+
405
+ def clean_container_project (imagespec ):
400
406
hub = HubInstance ()
401
- scanner = ContainerImageScanner (hub , imagespec , projname )
407
+ scanner = ContainerImageScanner (hub , imagespec )
402
408
scanner .cleanup_project_structure ()
403
409
404
410
@@ -411,7 +417,7 @@ def main(argv=None):
411
417
412
418
parser = ArgumentParser ()
413
419
parser .add_argument ('imagespec' , help = "Container image tag, e.g. repository/imagename:version" )
414
- parser .add_argument ('projname ' , help = "Project Name " )
420
+ parser .add_argument ('--inspector ' , default = False , help = "Runs Docker Inspector scan on squashed image " )
415
421
parser .add_argument ('--cleanup' , default = False , help = "Delete project hierarchy only. Do not scan" )
416
422
parser .add_argument ('--rescan-layer' ,default = 0 , type = int , help = "Rescan specific layer in case of failure, 0 - scan as usual" )
417
423
parser .add_argument ('--dockerfile' ,default = None , type = str , help = "Specify dockerfile used to build this container(experimantal), can't use with --base-image" )
@@ -434,18 +440,19 @@ def main(argv=None):
434
440
sys .exit (1 )
435
441
436
442
if args .cleanup :
437
- clean_container_project (args .imagespec , args . projname )
443
+ clean_container_project (args .imagespec )
438
444
sys .exit (1 )
439
445
if args .dockerfile or args .base_image :
440
- clean_container_project (args .imagespec , args . projname )
441
- scan_container_image_with_dockerfile (args .imagespec , args .projname , args . dockerfile , args .base_image , args .omit_base_layers )
446
+ clean_container_project (args .imagespec )
447
+ scan_container_image_with_dockerfile (args .imagespec , args .dockerfile , args .base_image , args .omit_base_layers )
442
448
else :
443
449
if args .rescan_layer == 0 :
444
- clean_container_project (args .imagespec , args . projname )
445
- scan_container_image (args .imagespec , args . projname )
450
+ clean_container_project (args .imagespec )
451
+ scan_container_image (args .imagespec )
446
452
else :
447
- scan_container_image (args .imagespec , args .rescan_layer , args .projname )
448
-
453
+ scan_container_image (args .imagespec , args .rescan_layer )
454
+ if args .inspector :
455
+ scan_squashed_image (args .imagespec )
456
+
449
457
if __name__ == "__main__" :
450
458
sys .exit (main ())
451
-
0 commit comments