ThePorgs / Exegol

Fully featured and community-driven hacking environment
https://exegol.readthedocs.io/
GNU General Public License v3.0
1.95k stars 191 forks source link

Add podman compatibility #193

Open florentulve opened 11 months ago

florentulve commented 11 months ago

fix #182 first attempt to add podman support: starting a container work. I have not tested all use cases

Nariod commented 11 months ago

Is it possible to review/merge this PR ? I'd love to use Exegol with podman instead of docker.

All the best, Nariod

ShutdownRepo commented 11 months ago

Have you been able to test it? Didn't have the bandwidth just yet

Dramelac commented 11 months ago

Thank you for the PR, I will check this as soon as possible.

Nariod commented 11 months ago

Sorry for the delay, back from engagement (using Exegol <3). I tried the branch feat/podman from the repo https://github.com/florentulve/Exegol.git. On a fresh Fedora VM with podman installed, I get the following result: image I guess podman is only supported once the container is created @florentulve ?

florentulve commented 11 months ago

Hi, sorry for the delay.

I think the trick here is to have the docker/podman compatibility layer installed. (Set up this for year now and forgot to mention that, sorry).

sudo dnf install podman-docker
systemctl --user enable --now podman.socket
set -gx DOCKER_HOST "unix:///$XDG_RUNTIME_DIR/podman/podman.sock"

It's not a first class support though but as a podman user I think it's ok.

image

festival4799 commented 11 months ago

I just tried your branch feat/podman but encountered an error :

user@localhost-live:~$ exegol start test-podman light
[*] Exegol is currently in version v4.3.0b1 [9f371802]
[*] Exegol Discord serv.: https://discord.gg/cXThyp7D6P
[*] Exegol documentation: https://exegol.rtfd.io/
[+] We thank Capgemini for supporting the project (helping with dev) 🙏                                                                      
[+] We thank HackTheBox for sponsoring the multi-arch support 💚                                                                             

[!] You are currently using a Beta version of Exegol, which may be unstable.                                                                 
[*] Starting exegol                                                                                                                          
[*] Arguments supplied with the command, skipping interactive mode                                                                           

⭐ Container summary                                                         
┌──────────────────┬────────────────────────────────────────────────────────┐
│             Name │ test-podman                                            │
│            Image │ light - v.3.1.1 (Update available (v.3.1.1 ➡ v.3.1.1)) │
├──────────────────┼────────────────────────────────────────────────────────┤
│      Credentials │ root : CRWRydP90ooi92xuAMttCsj081SzEQ                  │
│          Desktop │ Off 🪓                                                 │
│              X11 │ On ✔                                                   │
│          Network │ host                                                   │
│         Timezone │ On ✔                                                   │
│ Exegol resources │ On ✔ (/opt/resources)                                  │
│     My resources │ On ✔ (/opt/my-resources)                               │
│    Shell logging │ Off 🪓                                                 │
│       Privileged │ Off ✔                                                  │
│        Workspace │ Dedicated (/workspace)                                 │
└──────────────────┴────────────────────────────────────────────────────────┘

[*] Creating new exegol container                                                                                                            
[+] Exegol container successfully created !                                                                                                  
[-] It seems that something unexpected happened ...                                                                                          
[-] To draw our attention to the problem and allow us to fix it, you can share your error with us (by copying and pasting it with this       
syntax: ``` <error> ```) by creating a GitHub issue at this address: https://github.com/ThePorgs/Exegol/issues                               
[+] Thank you for your collaboration!                                                                                                        
╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
│ /home/user/Exegol/exegol/manager/ExegolManager.py:396 in __loadOrCreateContainer                 │
│                                                                                                  │
│   393 │   │   │   │   │   │   │   │   raise NotImplemented                                       │
│   394 │   │   │   │   else:                                                                      │
│   395 │   │   │   │   │   assert container_tag is not None                                       │
│ ❱ 396 │   │   │   │   │   cls.__container = DockerUtils.getContainer(container_tag)              │
│   397 │   │   except (ObjectNotFound, IndexError):                                               │
│   398 │   │   │   # ObjectNotFound is raised when the container_tag provided by the user does    │
│   399 │   │   │   # IndexError is raise when no container exist (raised from TUI interactive s   │
│                                                                                                  │
│ ╭───────────────────────────────── locals ──────────────────────────────────╮                    │
│ │                cls = <class 'exegol.manager.ExegolManager.ExegolManager'> │                    │
│ │      container_tag = 'test-podman'                                        │                    │
│ │     container_tags = None                                                 │                    │
│ │           multiple = False                                                │                    │
│ │         must_exist = False                                                │                    │
│ │ override_container = None                                                 │                    │
│ ╰───────────────────────────────────────────────────────────────────────────╯                    │
│                                                                                                  │
│ /home/user/Exegol/exegol/utils/DockerUtils.py:183 in getContainer                                │
│                                                                                                  │
│   180 │   │   │   │   lowered_tag = tag.lower()                                                  │
│   181 │   │   │   │   if lowered_tag != tag:                                                     │
│   182 │   │   │   │   │   return cls.getContainer(lowered_tag)                                   │
│ ❱ 183 │   │   │   raise ObjectNotFound                                                           │
│   184 │   │   # Filter results with exact name matching                                          │
│   185 │   │   for c in container:                                                                │
│   186 │   │   │   if c.name == f"exegol-{tag}":                                                  │
│                                                                                                  │
│ ╭────────────────────────── locals ──────────────────────────╮                                   │
│ │       cls = <class 'exegol.utils.DockerUtils.DockerUtils'> │                                   │
│ │ container = []                                             │                                   │
│ │       tag = 'test-podman'                                  │                                   │
│ ╰────────────────────────────────────────────────────────────╯                                   │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
ObjectNotFound

During handling of the above exception, another exception occurred:

╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
│ /home/user/Exegol/exegol/manager/ExegolController.py:61 in main                                  │
│                                                                                                  │
│   58 │   │   # Set logger verbosity depending on user input                                      │
│   59 │   │   ExeLog.setVerbosity(ParametersManager().verbosity, ParametersManager().quiet)       │
│   60 │   │   # Start Main controller & Executing action selected by user CLI                     │
│ ❱ 61 │   │   ExegolController.call_action()                                                      │
│   62 │   except KeyboardInterrupt:                                                               │
│   63 │   │   logger.empty_line()                                                                 │
│   64 │   │   logger.info("Exiting")                                                              │
│                                                                                                  │
│ /home/user/Exegol/exegol/manager/ExegolController.py:41 in call_action                           │
│                                                                                                  │
│   38 │   │   │   # Fetch main operation function                                                 │
│   39 │   │   │   main_action = cls.__action()                                                    │
│   40 │   │   │   # Execute main function                                                         │
│ ❱ 41 │   │   │   main_action()                                                                   │
│   42 │   │   else:                                                                               │
│   43 │   │   │   # TODO review required parameters                                               │
│   44 │   │   │   logger.error(f"These parameters are mandatory but missing: {','.join(missing    │
│                                                                                                  │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │            cls = <class 'exegol.manager.ExegolController.ExegolController'>                  │ │
│ │    main_action = <bound method ExegolManager.start of <class                                 │ │
│ │                  'exegol.manager.ExegolManager.ExegolManager'>>                              │ │
│ │ missing_params = []                                                                          │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                  │
│ /home/user/Exegol/exegol/manager/ExegolManager.py:77 in start                                    │
│                                                                                                  │
│    74 │   │   cls.__interactive_mode = not bool(ParametersManager().containertag)                │
│    75 │   │   if not cls.__interactive_mode:                                                     │
│    76 │   │   │   logger.info("Arguments supplied with the command, skipping interactive mode"   │
│ ❱  77 │   │   container = cls.__loadOrCreateContainer()                                          │
│    78 │   │   assert container is not None and type(container) is ExegolContainer                │
│    79 │   │   if not container.isNew():                                                          │
│    80 │   │   │   # Check and warn user if some parameters don't apply to the current session    │
│                                                                                                  │
│ ╭────────────────────────── locals ──────────────────────────╮                                   │
│ │ cls = <class 'exegol.manager.ExegolManager.ExegolManager'> │                                   │
│ ╰────────────────────────────────────────────────────────────╯                                   │
│                                                                                                  │
│ /home/user/Exegol/exegol/manager/ExegolManager.py:404 in __loadOrCreateContainer                 │
│                                                                                                  │
│   401 │   │   │   if must_exist:                                                                 │
│   402 │   │   │   │   logger.warning(f"The container named '{container_tag}' has not been foun   │
│   403 │   │   │   │   return [] if multiple else None                                            │
│ ❱ 404 │   │   │   return cls.__createContainer(container_tag)                                    │
│   405 │   │   assert cls.__container is not None                                                 │
│   406 │   │   return cast(Union[Optional[ExegolContainer], List[ExegolContainer]], cls.__conta   │
│   407                                                                                            │
│                                                                                                  │
│ ╭───────────────────────────────── locals ──────────────────────────────────╮                    │
│ │                cls = <class 'exegol.manager.ExegolManager.ExegolManager'> │                    │
│ │      container_tag = 'test-podman'                                        │                    │
│ │     container_tags = None                                                 │                    │
│ │           multiple = False                                                │                    │
│ │         must_exist = False                                                │                    │
│ │ override_container = None                                                 │                    │
│ ╰───────────────────────────────────────────────────────────────────────────╯                    │
│                                                                                                  │
│ /home/user/Exegol/exegol/manager/ExegolManager.py:521 in __createContainer                       │
│                                                                                                  │
│   518 │   │   │   │   │   │   "read CLI options with [green]exegol start -h[/green]")            │
│   519 │   │                                                                                      │
│   520 │   │   container = DockerUtils.createContainer(model)                                     │
│ ❱ 521 │   │   container.postCreateSetup()                                                        │
│   522 │   │   return container                                                                   │
│   523 │                                                                                          │
│   524 │   @classmethod                                                                           │
│                                                                                                  │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │       cls = <class 'exegol.manager.ExegolManager.ExegolManager'>                             │ │
│ │    config = <exegol.model.ContainerConfig.ContainerConfig object at 0x7fed873e6ff0>          │ │
│ │ container = <exegol.model.ExegolContainer.ExegolContainer object at 0x7fed86626de0>          │ │
│ │     image = light (3.1.1/3.1.1 amd64) - 11.6GB - ([orange3]Update available (v.3.1.1         │ │
│ │             :arrow_right: v.3.1.1)[/orange3], [bright_black]N/A[/bright_black])              │ │
│ │     model = <exegol.model.ExegolContainerTemplate.ExegolContainerTemplate object at          │ │
│ │             0x7fed86442120>                                                                  │ │
│ │      name = 'test-podman'                                                                    │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                  │
│ /home/user/Exegol/exegol/model/ExegolContainer.py:310 in postCreateSetup                         │
│                                                                                                  │
│   307 │   │   │   # Update entrypoint script in the container                                    │
│   308 │   │   │   self.__container.put_archive("/", ImageScriptSync.getImageSyncTarData(includ   │
│   309 │   │   │   if self.__container.status.lower() == "created":                               │
│ ❱ 310 │   │   │   │   self.__start_container()                                                   │
│   311 │   │   │   try:                                                                           │
│   312 │   │   │   │   self.__updatePasswd()                                                      │
│   313 │   │   │   except APIError as e:                                                          │
│                                                                                                  │
│ ╭──────────────────────────────────────── locals ────────────────────────────────────────╮       │
│ │ is_temporary = False                                                                   │       │
│ │         self = <exegol.model.ExegolContainer.ExegolContainer object at 0x7fed86626de0> │       │
│ ╰────────────────────────────────────────────────────────────────────────────────────────╯       │
│                                                                                                  │
│ /home/user/Exegol/exegol/model/ExegolContainer.py:123 in __start_container                       │
│                                                                                                  │
│   120 │   │   │   if not self.config.legacy_entrypoint:  # TODO improve startup compatibility    │
│   121 │   │   │   │   try:                                                                       │
│   122 │   │   │   │   │   # Try to find log / startup messages. Will time out after 2 seconds    │
│ ❱ 123 │   │   │   │   │   for line in ContainerLogStream(self.__container, start_date=start_da   │
│   124 │   │   │   │   │   │   # Once the last log "READY" is received, the startup sequence is   │
│   125 │   │   │   │   │   │   if line == "READY":                                                │
│   126 │   │   │   │   │   │   │   break                                                          │
│                                                                                                  │
│ ╭─────────────────────────────────────── locals ───────────────────────────────────────╮         │
│ │   progress = <rich.status.Status object at 0x7fed8645b350>                           │         │
│ │       self = <exegol.model.ExegolContainer.ExegolContainer object at 0x7fed86626de0> │         │
│ │ start_date = datetime.datetime(2023, 12, 13, 21, 19, 39, 408110)                     │         │
│ ╰──────────────────────────────────────────────────────────────────────────────────────╯         │
│                                                                                                  │
│ /home/user/Exegol/exegol/utils/ContainerLogStream.py:57 in __next__                              │
│                                                                                                  │
│   54 │   │   │   │   │   return line                                                             │
│   55 │   │   │   │   else:                                                                       │
│   56 │   │   │   │   │   self.__enable_timeout = False  # disable timeout if the container is    │
│ ❱ 57 │   │   │   │   │   self.__line_buffer += streamed_char  # add characters to the line bu    │
│   58 │   │   │   # When the data stream is empty, check if a timeout condition apply             │
│   59 │   │   │   if self.__enable_timeout and self.__until_date >= self.__timeout_date:          │
│   60 │   │   │   │   logger.debug("Container log stream timed-out")                              │
│                                                                                                  │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │          self = <exegol.utils.ContainerLogStream.ContainerLogStream object at                │ │
│ │                 0x7fed86483920>                                                              │ │
│ │ streamed_char = 'S'                                                                          │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
TypeError: can't concat str to bytes

My setup is a brand new Fedora 39 VM with podman-docker installed. Nothing too fancy IMHO.

Nariod commented 10 months ago

I just tried your branch feat/podman but encountered an error :

user@localhost-live:~$ exegol start test-podman light
[*] Exegol is currently in version v4.3.0b1 [9f371802]
[*] Exegol Discord serv.: https://discord.gg/cXThyp7D6P
[*] Exegol documentation: https://exegol.rtfd.io/
[+] We thank Capgemini for supporting the project (helping with dev) 🙏                                                                      
[+] We thank HackTheBox for sponsoring the multi-arch support 💚                                                                             

[!] You are currently using a Beta version of Exegol, which may be unstable.                                                                 
[*] Starting exegol                                                                                                                          
[*] Arguments supplied with the command, skipping interactive mode                                                                           

⭐ Container summary                                                         
┌──────────────────┬────────────────────────────────────────────────────────┐
│             Name │ test-podman                                            │
│            Image │ light - v.3.1.1 (Update available (v.3.1.1 ➡ v.3.1.1)) │
├──────────────────┼────────────────────────────────────────────────────────┤
│      Credentials │ root : CRWRydP90ooi92xuAMttCsj081SzEQ                  │
│          Desktop │ Off 🪓                                                 │
│              X11 │ On ✔                                                   │
│          Network │ host                                                   │
│         Timezone │ On ✔                                                   │
│ Exegol resources │ On ✔ (/opt/resources)                                  │
│     My resources │ On ✔ (/opt/my-resources)                               │
│    Shell logging │ Off 🪓                                                 │
│       Privileged │ Off ✔                                                  │
│        Workspace │ Dedicated (/workspace)                                 │
└──────────────────┴────────────────────────────────────────────────────────┘

[*] Creating new exegol container                                                                                                            
[+] Exegol container successfully created !                                                                                                  
[-] It seems that something unexpected happened ...                                                                                          
[-] To draw our attention to the problem and allow us to fix it, you can share your error with us (by copying and pasting it with this       
syntax: ``` <error> ```) by creating a GitHub issue at this address: https://github.com/ThePorgs/Exegol/issues                               
[+] Thank you for your collaboration!                                                                                                        
╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
│ /home/user/Exegol/exegol/manager/ExegolManager.py:396 in __loadOrCreateContainer                 │
│                                                                                                  │
│   393 │   │   │   │   │   │   │   │   raise NotImplemented                                       │
│   394 │   │   │   │   else:                                                                      │
│   395 │   │   │   │   │   assert container_tag is not None                                       │
│ ❱ 396 │   │   │   │   │   cls.__container = DockerUtils.getContainer(container_tag)              │
│   397 │   │   except (ObjectNotFound, IndexError):                                               │
│   398 │   │   │   # ObjectNotFound is raised when the container_tag provided by the user does    │
│   399 │   │   │   # IndexError is raise when no container exist (raised from TUI interactive s   │
│                                                                                                  │
│ ╭───────────────────────────────── locals ──────────────────────────────────╮                    │
│ │                cls = <class 'exegol.manager.ExegolManager.ExegolManager'> │                    │
│ │      container_tag = 'test-podman'                                        │                    │
│ │     container_tags = None                                                 │                    │
│ │           multiple = False                                                │                    │
│ │         must_exist = False                                                │                    │
│ │ override_container = None                                                 │                    │
│ ╰───────────────────────────────────────────────────────────────────────────╯                    │
│                                                                                                  │
│ /home/user/Exegol/exegol/utils/DockerUtils.py:183 in getContainer                                │
│                                                                                                  │
│   180 │   │   │   │   lowered_tag = tag.lower()                                                  │
│   181 │   │   │   │   if lowered_tag != tag:                                                     │
│   182 │   │   │   │   │   return cls.getContainer(lowered_tag)                                   │
│ ❱ 183 │   │   │   raise ObjectNotFound                                                           │
│   184 │   │   # Filter results with exact name matching                                          │
│   185 │   │   for c in container:                                                                │
│   186 │   │   │   if c.name == f"exegol-{tag}":                                                  │
│                                                                                                  │
│ ╭────────────────────────── locals ──────────────────────────╮                                   │
│ │       cls = <class 'exegol.utils.DockerUtils.DockerUtils'> │                                   │
│ │ container = []                                             │                                   │
│ │       tag = 'test-podman'                                  │                                   │
│ ╰────────────────────────────────────────────────────────────╯                                   │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
ObjectNotFound

During handling of the above exception, another exception occurred:

╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
│ /home/user/Exegol/exegol/manager/ExegolController.py:61 in main                                  │
│                                                                                                  │
│   58 │   │   # Set logger verbosity depending on user input                                      │
│   59 │   │   ExeLog.setVerbosity(ParametersManager().verbosity, ParametersManager().quiet)       │
│   60 │   │   # Start Main controller & Executing action selected by user CLI                     │
│ ❱ 61 │   │   ExegolController.call_action()                                                      │
│   62 │   except KeyboardInterrupt:                                                               │
│   63 │   │   logger.empty_line()                                                                 │
│   64 │   │   logger.info("Exiting")                                                              │
│                                                                                                  │
│ /home/user/Exegol/exegol/manager/ExegolController.py:41 in call_action                           │
│                                                                                                  │
│   38 │   │   │   # Fetch main operation function                                                 │
│   39 │   │   │   main_action = cls.__action()                                                    │
│   40 │   │   │   # Execute main function                                                         │
│ ❱ 41 │   │   │   main_action()                                                                   │
│   42 │   │   else:                                                                               │
│   43 │   │   │   # TODO review required parameters                                               │
│   44 │   │   │   logger.error(f"These parameters are mandatory but missing: {','.join(missing    │
│                                                                                                  │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │            cls = <class 'exegol.manager.ExegolController.ExegolController'>                  │ │
│ │    main_action = <bound method ExegolManager.start of <class                                 │ │
│ │                  'exegol.manager.ExegolManager.ExegolManager'>>                              │ │
│ │ missing_params = []                                                                          │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                  │
│ /home/user/Exegol/exegol/manager/ExegolManager.py:77 in start                                    │
│                                                                                                  │
│    74 │   │   cls.__interactive_mode = not bool(ParametersManager().containertag)                │
│    75 │   │   if not cls.__interactive_mode:                                                     │
│    76 │   │   │   logger.info("Arguments supplied with the command, skipping interactive mode"   │
│ ❱  77 │   │   container = cls.__loadOrCreateContainer()                                          │
│    78 │   │   assert container is not None and type(container) is ExegolContainer                │
│    79 │   │   if not container.isNew():                                                          │
│    80 │   │   │   # Check and warn user if some parameters don't apply to the current session    │
│                                                                                                  │
│ ╭────────────────────────── locals ──────────────────────────╮                                   │
│ │ cls = <class 'exegol.manager.ExegolManager.ExegolManager'> │                                   │
│ ╰────────────────────────────────────────────────────────────╯                                   │
│                                                                                                  │
│ /home/user/Exegol/exegol/manager/ExegolManager.py:404 in __loadOrCreateContainer                 │
│                                                                                                  │
│   401 │   │   │   if must_exist:                                                                 │
│   402 │   │   │   │   logger.warning(f"The container named '{container_tag}' has not been foun   │
│   403 │   │   │   │   return [] if multiple else None                                            │
│ ❱ 404 │   │   │   return cls.__createContainer(container_tag)                                    │
│   405 │   │   assert cls.__container is not None                                                 │
│   406 │   │   return cast(Union[Optional[ExegolContainer], List[ExegolContainer]], cls.__conta   │
│   407                                                                                            │
│                                                                                                  │
│ ╭───────────────────────────────── locals ──────────────────────────────────╮                    │
│ │                cls = <class 'exegol.manager.ExegolManager.ExegolManager'> │                    │
│ │      container_tag = 'test-podman'                                        │                    │
│ │     container_tags = None                                                 │                    │
│ │           multiple = False                                                │                    │
│ │         must_exist = False                                                │                    │
│ │ override_container = None                                                 │                    │
│ ╰───────────────────────────────────────────────────────────────────────────╯                    │
│                                                                                                  │
│ /home/user/Exegol/exegol/manager/ExegolManager.py:521 in __createContainer                       │
│                                                                                                  │
│   518 │   │   │   │   │   │   "read CLI options with [green]exegol start -h[/green]")            │
│   519 │   │                                                                                      │
│   520 │   │   container = DockerUtils.createContainer(model)                                     │
│ ❱ 521 │   │   container.postCreateSetup()                                                        │
│   522 │   │   return container                                                                   │
│   523 │                                                                                          │
│   524 │   @classmethod                                                                           │
│                                                                                                  │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │       cls = <class 'exegol.manager.ExegolManager.ExegolManager'>                             │ │
│ │    config = <exegol.model.ContainerConfig.ContainerConfig object at 0x7fed873e6ff0>          │ │
│ │ container = <exegol.model.ExegolContainer.ExegolContainer object at 0x7fed86626de0>          │ │
│ │     image = light (3.1.1/3.1.1 amd64) - 11.6GB - ([orange3]Update available (v.3.1.1         │ │
│ │             :arrow_right: v.3.1.1)[/orange3], [bright_black]N/A[/bright_black])              │ │
│ │     model = <exegol.model.ExegolContainerTemplate.ExegolContainerTemplate object at          │ │
│ │             0x7fed86442120>                                                                  │ │
│ │      name = 'test-podman'                                                                    │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                  │
│ /home/user/Exegol/exegol/model/ExegolContainer.py:310 in postCreateSetup                         │
│                                                                                                  │
│   307 │   │   │   # Update entrypoint script in the container                                    │
│   308 │   │   │   self.__container.put_archive("/", ImageScriptSync.getImageSyncTarData(includ   │
│   309 │   │   │   if self.__container.status.lower() == "created":                               │
│ ❱ 310 │   │   │   │   self.__start_container()                                                   │
│   311 │   │   │   try:                                                                           │
│   312 │   │   │   │   self.__updatePasswd()                                                      │
│   313 │   │   │   except APIError as e:                                                          │
│                                                                                                  │
│ ╭──────────────────────────────────────── locals ────────────────────────────────────────╮       │
│ │ is_temporary = False                                                                   │       │
│ │         self = <exegol.model.ExegolContainer.ExegolContainer object at 0x7fed86626de0> │       │
│ ╰────────────────────────────────────────────────────────────────────────────────────────╯       │
│                                                                                                  │
│ /home/user/Exegol/exegol/model/ExegolContainer.py:123 in __start_container                       │
│                                                                                                  │
│   120 │   │   │   if not self.config.legacy_entrypoint:  # TODO improve startup compatibility    │
│   121 │   │   │   │   try:                                                                       │
│   122 │   │   │   │   │   # Try to find log / startup messages. Will time out after 2 seconds    │
│ ❱ 123 │   │   │   │   │   for line in ContainerLogStream(self.__container, start_date=start_da   │
│   124 │   │   │   │   │   │   # Once the last log "READY" is received, the startup sequence is   │
│   125 │   │   │   │   │   │   if line == "READY":                                                │
│   126 │   │   │   │   │   │   │   break                                                          │
│                                                                                                  │
│ ╭─────────────────────────────────────── locals ───────────────────────────────────────╮         │
│ │   progress = <rich.status.Status object at 0x7fed8645b350>                           │         │
│ │       self = <exegol.model.ExegolContainer.ExegolContainer object at 0x7fed86626de0> │         │
│ │ start_date = datetime.datetime(2023, 12, 13, 21, 19, 39, 408110)                     │         │
│ ╰──────────────────────────────────────────────────────────────────────────────────────╯         │
│                                                                                                  │
│ /home/user/Exegol/exegol/utils/ContainerLogStream.py:57 in __next__                              │
│                                                                                                  │
│   54 │   │   │   │   │   return line                                                             │
│   55 │   │   │   │   else:                                                                       │
│   56 │   │   │   │   │   self.__enable_timeout = False  # disable timeout if the container is    │
│ ❱ 57 │   │   │   │   │   self.__line_buffer += streamed_char  # add characters to the line bu    │
│   58 │   │   │   # When the data stream is empty, check if a timeout condition apply             │
│   59 │   │   │   if self.__enable_timeout and self.__until_date >= self.__timeout_date:          │
│   60 │   │   │   │   logger.debug("Container log stream timed-out")                              │
│                                                                                                  │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │          self = <exegol.utils.ContainerLogStream.ContainerLogStream object at                │ │
│ │                 0x7fed86483920>                                                              │ │
│ │ streamed_char = 'S'                                                                          │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
TypeError: can't concat str to bytes

My setup is a brand new Fedora 39 VM with podman-docker installed. Nothing too fancy IMHO.

Try to run it twice. I get the same error as yours on the first try, but it successfully starts the container anyway. On the second try, everything works as expected.

Nariod commented 10 months ago

@polluxtroy3758 , on first try : image

Then, on second try: image

Nariod commented 10 months ago

To sum it up, in order to have a working Exegol with podman on an up-to-date Fedora 39:

sudo dnf install podman-docker python3-pip
sudo systemctl enable --now podman.socket
git clone https://github.com/florentulve/Exegol.git
cd Exegol
git checkout feat/podman
sudo python3 -m pip install --requirement requirements.txt
sudo python3 exegol.py

First attempt at starting a container will return an error but starts the container anyway. Second attempt will give the expected result. From my first tests, GUI applications are working fine (tested with Firefox).

I will try to make it work without root rights.

Dramelac commented 10 months ago

Thanks for the PR, but podman support doesn't seem mature and stable enough to be added to the official Exegol as it is. So I'm going to draft the PR for the time being.

When I have time to fully add podman support, I'll be able to start from this PR, unless things change before then.

Thanks again for your help and interest in Exegol!