# ---- Stage 1: Build Frontend ---- FROM node:22-alpine AS frontend-builder WORKDIR /frontend COPY frontend/package*.json ./ RUN npm install COPY frontend . RUN npm run build # ---- Stage 2: Final Image ---- FROM savonet/liquidsoap:v2.2.5 # Switch to root to install packages USER root # Install required packages # - icecast2: streaming server # - supervisor: process manager # - python3-venv, python3-pip: for the backend # - ffmpeg, libsndfile1: backend audio processing RUN apt-get update && apt-get install -y \ icecast2 \ supervisor \ python3 \ python3-venv \ python3-pip \ ffmpeg \ libsndfile1 \ && rm -rf /var/lib/apt/lists/* # Set up Icecast directories and permissions RUN mkdir -p /var/log/icecast2 /etc/icecast2 /var/run/icecast2 \ && chown -R liquidsoap:liquidsoap /var/log/icecast2 /etc/icecast2 /var/run/icecast2 COPY icecast.xml /etc/icecast2/icecast.xml # Prepare python environment WORKDIR /app RUN python3 -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" COPY app/requirements.txt /app/ RUN pip install --no-cache-dir -r requirements.txt # Copy backend code COPY app /app/app # Copy liquidsoap config COPY liquidsoap /app/liquidsoap # Copy built frontend from Stage 1 COPY --from=frontend-builder /frontend/dist /app/frontend/dist # Copy supervisord config COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf # Give liquidsoap user permissions to /app and /data RUN mkdir -p /data \ && chown -R liquidsoap:liquidsoap /app /data /opt/venv # Copy entrypoint script COPY docker-entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/docker-entrypoint.sh # Expose required ports: 8080 (API/Web UI), 8000 (Icecast) EXPOSE 8080 8000 # Start via entrypoint (runs as root to fix permissions, then starts supervisord) ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]