1
1
from datetime import datetime
2
2
from typing import Optional , List , Dict , Any , Union
3
3
4
- from docker .models .containers import Container
5
- from docker .models .images import Image
4
+ from docker .models .containers import Container as DockerContainer
5
+ from docker .models .images import Image as DockerImage
6
+ from podman .domain .containers import Container as PodmanContainer
7
+ from podman .domain .images import Image as PodmanImage
6
8
from rich .status import Status
7
9
8
10
from exegol .config .DataCache import DataCache
@@ -24,7 +26,7 @@ def __init__(self,
24
26
dockerhub_data : Optional [Dict [str , Any ]] = None ,
25
27
meta_img : Optional [MetaImages ] = None ,
26
28
image_id : Optional [str ] = None ,
27
- docker_image : Optional [Image ] = None ,
29
+ docker_image : Optional [Union [ DockerImage , PodmanImage ] ] = None ,
28
30
isUpToDate : bool = False ):
29
31
"""Docker image default value"""
30
32
# Prepare parameters
@@ -36,7 +38,7 @@ def __init__(self,
36
38
version_parsed = MetaImages .tagNameParsing (name )
37
39
self .__version_specific = bool (version_parsed )
38
40
# Init attributes
39
- self .__image : Optional [Image ] = docker_image
41
+ self .__image : Optional [Union [ DockerImage , PodmanImage ] ] = docker_image
40
42
self .__name : str = name
41
43
self .__alt_name : str = ''
42
44
self .__arch = ""
@@ -150,7 +152,7 @@ def resetDockerImage(self):
150
152
self .__build_date = "[bright_black]N/A[/bright_black]"
151
153
self .__disk_size = "[bright_black]N/A[/bright_black]"
152
154
153
- def setDockerObject (self , docker_image : Image ):
155
+ def setDockerObject (self , docker_image : Union [ DockerImage , PodmanImage ] ):
154
156
"""Docker object setter. Parse object to set up self configuration."""
155
157
self .__image = docker_image
156
158
# When a docker image exist, image is locally installed
@@ -230,7 +232,7 @@ def __labelVersionParsing(self):
230
232
self .__profile_version = self .__image_version
231
233
232
234
@classmethod
233
- def parseAliasTagName (cls , image : Image ) -> str :
235
+ def parseAliasTagName (cls , image : Union [ DockerImage , PodmanImage ] ) -> str :
234
236
"""Create a tag name alias from labels when image's tag is lost"""
235
237
return image .labels .get ("org.exegol.tag" , "<none>" ) + "-" + image .labels .get ("org.exegol.version" , "v?" )
236
238
@@ -247,7 +249,7 @@ def syncStatus(self):
247
249
else :
248
250
self .__custom_status = ""
249
251
250
- def syncContainerData (self , container : Container ):
252
+ def syncContainerData (self , container : Union [ DockerImage , PodmanImage ] ):
251
253
"""Synchronization between the container and the image.
252
254
If the image has been updated, the tag is lost,
253
255
but it is saved in the properties of the container that still uses it."""
@@ -352,7 +354,7 @@ def __mergeMetaImages(cls, images: List[MetaImages]):
352
354
pass
353
355
354
356
@classmethod
355
- def mergeImages (cls , remote_images : List [MetaImages ], local_images : List [Image ], status : Status ) -> List ['ExegolImage' ]:
357
+ def mergeImages (cls , remote_images : List [MetaImages ], local_images : List [Union [ DockerImage , PodmanImage ] ], status : Status ) -> List ['ExegolImage' ]:
356
358
"""Compare and merge local images and remote images.
357
359
Use case to process :
358
360
- up-to-date : "Version specific" image can use exact digest_id matching. Latest image must match corresponding tag
@@ -537,11 +539,11 @@ def __setDigest(self, digest: Optional[str]):
537
539
self .__digest = digest
538
540
539
541
@staticmethod
540
- def __parseDigest (docker_image : Image ) -> str :
542
+ def __parseDigest (docker_image : Union [ DockerImage , PodmanImage ] ) -> str :
541
543
"""Parse the remote image digest ID.
542
544
Return digest id from the docker object."""
543
545
for digest_id in docker_image .attrs ["RepoDigests" ]:
544
- if digest_id . startswith ( ConstantConfig .IMAGE_NAME ) : # Find digest id from the right repository
546
+ if ConstantConfig .IMAGE_NAME in digest_id : # Find digest id from the right repository
545
547
return digest_id .split ('@' )[1 ]
546
548
return ""
547
549
@@ -558,9 +560,14 @@ def getLatestRemoteId(self) -> str:
558
560
return self .__profile_digest
559
561
560
562
def __setImageId (self , image_id : Optional [str ]):
561
- """Local image id setter"""
563
+ """Local image id setter for both Docker and Podman """
562
564
if image_id is not None :
563
- self .__image_id = image_id .split (":" )[1 ][:12 ]
565
+ # Check if the image_id contains a colon (as in Docker's format)
566
+ if ":" in image_id :
567
+ self .__image_id = image_id .split (":" )[1 ][:12 ]
568
+ else :
569
+ # For Podman, where image_id does not contain the 'sha256:' prefix
570
+ self .__image_id = image_id [:12 ]
564
571
565
572
def getLocalId (self ) -> str :
566
573
"""Local id getter"""
0 commit comments