FROM python:3.13-slim # ── System dependencies ─────────────────────────────────────────────────────── # GStreamer runtime + GObject Introspection typelibs needed at runtime. # libgirepository + libglib dev headers + gcc needed to compile PyGObject. # gosu: used by entrypoint to drop from root → mopidy after fixing permissions. RUN apt-get update \ && apt-get install -y --no-install-recommends \ # GStreamer runtime gstreamer1.0-plugins-good \ gstreamer1.0-plugins-bad \ gstreamer1.0-plugins-ugly \ gstreamer1.0-tools \ libgstreamer1.0-0 \ libgstreamer-plugins-base1.0-0 \ # GObject Introspection typelibs (used by PyGObject at runtime) gir1.2-gstreamer-1.0 \ gir1.2-gst-plugins-base-1.0 \ # Build deps for PyGObject (can't be removed — runtime .so links against them) libgirepository-2.0-dev \ libglib2.0-dev \ libcairo2-dev \ gcc \ pkg-config \ # Misc curl \ gettext-base \ gosu \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* # ── Python packages ─────────────────────────────────────────────────────────── # PyGObject must be compiled first so pip can resolve mopidy's gst dependency. # setuptools provides pkg_resources (no longer bundled in Python 3.13). # mopidy-spotify 5.x uses the Spotify Web API (no libspotify C extension). RUN pip install --no-cache-dir PyGObject \ && pip install --no-cache-dir \ "setuptools<72" \ mopidy \ mopidy-local \ mopidy-mpd \ mopidy-youtube \ "mopidy-spotify>=5.0.0" \ yt-dlp # ── Runtime user ────────────────────────────────────────────────────────────── # Entrypoint runs as root, fixes volume ownership, then execs as mopidy via gosu. RUN groupadd -r audio 2>/dev/null || true \ && useradd -r -g audio -d /var/lib/mopidy -s /sbin/nologin mopidy \ && mkdir -p /var/lib/mopidy /config \ && chown -R mopidy:audio /var/lib/mopidy /config COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh EXPOSE 6680 HEALTHCHECK --interval=20s --timeout=5s --start-period=30s \ CMD curl -sf http://localhost:6680/mopidy/rpc \ -d '{"jsonrpc":"2.0","id":1,"method":"core.get_version"}' \ -H 'Content-Type: application/json' | grep -q '"id": 1' || exit 1 ENTRYPOINT ["/entrypoint.sh"] CMD ["mopidy", "--config", "/tmp/mopidy.conf"]