[GH-ISSUE #461] Container creation fails with Podman HTTP 500 duplicate mount destination when mounts overrides default template path #280

Open
opened 2026-10-15 12:59:18 +00:00 by bsakaguchi · 2 comments
Owner

Originally created by @dustinblack on GitHub (Jul 21, 2026).
Original GitHub issue: https://github.com/games-on-whales/wolf/issues/461

Environment

  • OS: RHEL 9 (Linux 5.14)
  • Container Engine: Podman
  • Wolf Version: stable / main (ghcr.io/games-on-whales/wolf:stable)

Description

When an app runner definition in config.toml specifies a custom volume mapping under mounts (e.g. mounts = ['/etc/wolf/profile-data/mom/WolfSteam:/home/retro']) for an app image that has a default volume template mapped to /home/retro (such as WolfSteam), Wolf appends both mount entries into the container creation request without deduplicating target destination paths.

When running with Podman, Podman's SpecGen builder rejects the request and returns an HTTP 500 error:

INFO | [DOCKER] error 500 - {"cause":"duplicate mount destination","message":"fill out specgen: /home/retro: duplicate mount destination","response":500}

Steps to Reproduce

  1. In /etc/wolf/cfg/config.toml, add an app entry with an explicit mount targeting /home/retro:
    [[profiles.apps]]
    title = 'Steam - Direct'
    [profiles.apps.runner]
    image = 'ghcr.io/games-on-whales/steam:edge'
    mounts = [ '/etc/wolf/profile-data/mom/WolfSteam:/home/retro' ]
    name = 'WolfSteam'
    
  2. Launch the app directly from Moonlight.
  3. Observe Wolf log output reporting Podman HTTP 500 duplicate mount destination.

Workaround

Setting mounts = [] in config.toml (or using HostConfig.Binds inside base_create_json) bypasses the error.

Suggested Fix

Wolf's Docker/Podman container spec builder should deduplicate container destination paths prior to submitting the creation request, allowing explicit user mounts in config.toml to override default template volume targets.

Originally created by @dustinblack on GitHub (Jul 21, 2026). Original GitHub issue: https://github.com/games-on-whales/wolf/issues/461 ### Environment - **OS**: RHEL 9 (Linux 5.14) - **Container Engine**: Podman - **Wolf Version**: `stable` / `main` (`ghcr.io/games-on-whales/wolf:stable`) ### Description When an app runner definition in `config.toml` specifies a custom volume mapping under `mounts` (e.g. `mounts = ['/etc/wolf/profile-data/mom/WolfSteam:/home/retro']`) for an app image that has a default volume template mapped to `/home/retro` (such as `WolfSteam`), Wolf appends both mount entries into the container creation request without deduplicating target destination paths. When running with Podman, Podman's SpecGen builder rejects the request and returns an HTTP 500 error: ```text INFO | [DOCKER] error 500 - {"cause":"duplicate mount destination","message":"fill out specgen: /home/retro: duplicate mount destination","response":500} ``` ### Steps to Reproduce 1. In `/etc/wolf/cfg/config.toml`, add an app entry with an explicit mount targeting `/home/retro`: ```toml [[profiles.apps]] title = 'Steam - Direct' [profiles.apps.runner] image = 'ghcr.io/games-on-whales/steam:edge' mounts = [ '/etc/wolf/profile-data/mom/WolfSteam:/home/retro' ] name = 'WolfSteam' ``` 2. Launch the app directly from Moonlight. 3. Observe Wolf log output reporting Podman HTTP 500 `duplicate mount destination`. ### Workaround Setting `mounts = []` in `config.toml` (or using `HostConfig.Binds` inside `base_create_json`) bypasses the error. ### Suggested Fix Wolf's Docker/Podman container spec builder should deduplicate container destination paths prior to submitting the creation request, allowing explicit user mounts in `config.toml` to override default template volume targets.
Author
Owner

@dustinblack commented on GitHub (Jul 21, 2026):

Additional Workaround Finding: User Persistence via Custom HOME Path

We verified an effective workaround for maintaining full host data persistence when launching root apps directly from Moonlight without hitting Podman's duplicate mount error:

Rather than mounting to /home/retro (which triggers the SpecGen collision with the default template volume):

  1. Mount the host profile directory to a matching host path (or non-colliding container path):
    mounts = [ '/etc/wolf/profile-data/mom/WolfSteam:/etc/wolf/profile-data/mom/WolfSteam' ]
    
  2. Set HOME in Env to point directly to that mounted directory:
    "Env": [
      "HOME=/etc/wolf/profile-data/mom/WolfSteam"
    ]
    

This avoids the /home/retro duplicate mount target in Podman while ensuring Steam, Proton, Sway, and Gamescope save all persistent user credentials and data directly to the host system.

<!-- gh-comment-id:5032736375 --> @dustinblack commented on GitHub (Jul 21, 2026): ### Additional Workaround Finding: User Persistence via Custom `HOME` Path We verified an effective workaround for maintaining full host data persistence when launching root apps directly from Moonlight without hitting Podman's duplicate mount error: Rather than mounting to `/home/retro` (which triggers the SpecGen collision with the default template volume): 1. Mount the host profile directory to a matching host path (or non-colliding container path): ```toml mounts = [ '/etc/wolf/profile-data/mom/WolfSteam:/etc/wolf/profile-data/mom/WolfSteam' ] ``` 2. Set `HOME` in `Env` to point directly to that mounted directory: ```json "Env": [ "HOME=/etc/wolf/profile-data/mom/WolfSteam" ] ``` This avoids the `/home/retro` duplicate mount target in Podman while ensuring Steam, Proton, Sway, and Gamescope save all persistent user credentials and data directly to the host system.
Author
Owner

@ody commented on GitHub (Jul 22, 2026):

Why are you attempting to mount over the the entire /home/retro? Since Steam is the content which matters is this context you only really need to mount the Steam specific directories. In my config I mount what ever host directory I want Steam content stored in onto /home/retro/.local/share/Steam. My setup keeps the rest of the configs immutable but if you want all those other configs also on the host then you can mount them similarly.

I am wary of overriding the entire directory mount since Wolf is already mounting a session specific directory there.

<!-- gh-comment-id:5041937128 --> @ody commented on GitHub (Jul 22, 2026): Why are you attempting to mount over the the entire `/home/retro`? Since Steam is the content which matters is this context you only really need to mount the Steam specific directories. In my config I mount what ever host directory I want Steam content stored in onto `/home/retro/.local/share/Steam`. My setup keeps the rest of the configs immutable but if you want all those other configs also on the host then you can mount them similarly. I am wary of overriding the entire directory mount since Wolf is already mounting a session specific directory there.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
games-on-whales/wolf#280
No description provided.