diff --git a/Dockerfile.decypharr b/Dockerfile.decypharr new file mode 100644 index 0000000..947a8a9 --- /dev/null +++ b/Dockerfile.decypharr @@ -0,0 +1,23 @@ +# ============================================================================= +# Dockerfile.decypharr +# +# Thin wrapper around the upstream Decypharr image that adds a /etc/passwd +# entry for UID 1000 ("appuser"). This is required because the container is +# run as UID 1000 (via `user: PUID:PGID` in docker-compose.yml) and +# fusermount3 calls `id -un` to resolve the username before mounting the +# FUSE filesystem. Without a matching passwd entry fusermount3 exits with: +# +# fusermount3: could not determine username +# +# …which prevents the rclone WebDAV mount from ever establishing (issue #24). +# ============================================================================= + +ARG DECYPHARR_VERSION=v2.4 +FROM ghcr.io/sirrobot01/decypharr:${DECYPHARR_VERSION} + +# adduser flags: +# -u 1000 match the PUID used at runtime +# -D no password (daemon account) +# -H do not create a home directory +# -s /bin/sh minimal shell (required by some FUSE helpers) +RUN adduser -u 1000 -D -H -s /bin/sh appuser diff --git a/docker-compose.yml b/docker-compose.yml index 84f556f..7f95050 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,8 +19,18 @@ services: # ── Decypharr ────────────────────────────────────────────────── # Mocks qBittorrent API for Radarr/Sonarr, connects to TorBox, # handles WebDAV mounting via built-in rclone, and creates symlinks. + # + # We build a thin local image (Dockerfile.decypharr) on top of the + # upstream release. The only change is an `adduser` for UID 1000 so + # that fusermount3 can resolve the username when the container runs as + # a non-root user (fixes issue #24 / regression from #23). decypharr: - image: ghcr.io/sirrobot01/decypharr:v2.0 + build: + context: . + dockerfile: Dockerfile.decypharr + args: + DECYPHARR_VERSION: "v2.4" + image: torbox-decypharr:v2.4 container_name: decypharr user: "${PUID:-1000}:${PGID:-1000}" restart: unless-stopped