Docker¶
Pre-built images are published to GitHub Container Registry and Docker Hub — the same image, pick either:
Tags: latest for the newest release, the version of each release (0.1.8.0), and main — the branch,
rebuilt on every push, which is how to try a fix before it is released:
All of them are linux/amd64 and linux/arm64, built by .github/workflows/docker.yml. main is where unreleased
work lives, so it moves and can break; latest is the safe one.
On a NAS?
Unraid, ZimaOS, TrueNAS SCALE, Synology DSM and OpenMediaVault have ready-made templates with the right paths and user ids — see NAS and home servers.
docker compose up -d # uses the published image
docker compose up -d --build # or build locally from ./Dockerfile
Or by hand:
docker run -d --name rexarr -p 3939:3939 -e PUID=1000 -e PGID=1000 \
-v ./config:/config -v /path/to/media:/data/media \
ghcr.io/moonlightlaboratory/rexarr:latest
The image¶
Node 22 on Alpine with the distro ffmpeg (x264, x265, SVT-AV1, libaom, VP9, Opus), VAAPI drivers and fre:ac for
music — about 530 MB. Multi-stage build; the runtime layer carries only the compiled server, the client bundle and
production dependencies (about 45 MB of node modules). --build-arg WITH_FREAC=0 leaves fre:ac out (about 90 MB
smaller) if you do not use music.
docker build -t rexarr .
# another architecture:
docker buildx build --platform linux/amd64,linux/arm64 -t rexarr .
The JavaScript is built once on the host platform; only the runtime layer is per-architecture.
Volumes and permissions¶
PUID/PGID/UMASKwork like the LinuxServer images: the entrypoint reuses or creates a user with those ids, chowns/config, opens passed-through/dev/sr*//dev/dri/*nodes, then drops privileges./configholds everything (see Storage and environment:cache/,data/,log/). Mount it. To keep large in-progress encodes off the config disk, mount a volume at/config/cache/transcodesor setREXARR_TRANSCODE_DIR.- Media: mount it at the same path Radarr / Sonarr see it (for example
/data/mediain all three) and no path mapping is needed; otherwise add one under Settings → Path mappings. The health check on the System page tells you when a file an *arr app reports is not visible to Rexarr. - Rips: point Settings → Disc ripping → Rip directory at a roomy mounted volume (
/data/rips) that Radarr / Sonarr can see; Check import access asks both apps whether they can reach it (after path mappings).
Hardware encoding¶
- Pass
/dev/drifor Intel QuickSync / VAAPI (LIBVA_DRIVER_NAME=iHDis preset; the Intel drivers are included on amd64). - AMD VAAPI needs mesa, which adds about 200 MB — build with
--build-arg WITH_AMD_VAAPI=1if you want it. - NVENC needs an ffmpeg with CUDA support (mount one and point Settings → Encoding → FFmpeg at it) plus the NVIDIA container runtime.
- VideoToolbox is macOS-only and therefore not available in Docker.
Disc ripping in Docker¶
makemkvcon is not redistributable, so the default image cannot rip. Build docker/Dockerfile.makemkv yourself (it
compiles MakeMKV OSS + bin from makemkv.com, accepting their EULA), pass the drive nodes, and enter your MakeMKV key
once:
MakeMKV and Docker covers this in full, including what to do when you already run
a MakeMKV container of your own, and why its makemkvcon cannot simply be mounted into this image.
Sleep prevention does not apply
Rexarr never tries to keep the host awake from inside a container — the host's own power settings decide. See Keeping the computer awake.
Other details¶
HEALTHCHECKhits/api/health.- The server binds
0.0.0.0:3939;REXARR_PORT,REXARR_HOST,REXARR_DATA_DIRandLOG_LEVELare honoured. - Automatic updates are not available in Docker — pull the new image instead.