Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add podman compatibility #193

Draft
wants to merge 1 commit into
base: dev
Choose a base branch
from
Draft

Conversation

florentulve
Copy link

@florentulve florentulve commented Nov 30, 2023

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

Signed-off-by: Florent Ulvé <[email protected]>
@Nariod
Copy link

Nariod commented Dec 1, 2023

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

All the best,
Nariod

@ShutdownRepo
Copy link
Member

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

@Dramelac
Copy link
Member

Dramelac commented Dec 5, 2023

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

@Nariod
Copy link

Nariod commented Dec 9, 2023

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
Copy link
Author

florentulve commented Dec 12, 2023

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
Copy link

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
Copy link

Nariod commented Dec 28, 2023

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
Copy link

Nariod commented Dec 28, 2023

@polluxtroy3758 , on first try :
image

Then, on second try:
image

@Nariod
Copy link

Nariod commented Dec 28, 2023

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
Copy link
Member

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!

@Dramelac Dramelac added enhancement New feature or request waiting for additional changes Further changes are requested labels Jan 11, 2024
@Dramelac Dramelac marked this pull request as draft April 12, 2024 11:45
Copy link

@D3vil0p3r D3vil0p3r left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@florentulve by creating IMAGE_FULL_NAME will only add not needed redundant code. docker can easily take explicitly the registry name, so, what I would suggest is to remove IMAGE_FULL_NAME and just use IMAGE_NAME by adding docker.io/. It will work for both docker and podman without adding an additional variable and additional if conditions.

My assumption was not efficient.

Btw I created a new PR for this involving Python Podman library: #234

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request waiting for additional changes Further changes are requested
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants