Files
pmomusic/Dockerfile
Eric Coissac 9598bbac4a Bump version to 0.3.25 and remove unused pmoutils
Update version to 0.3.25 in Cargo.toml and version.txt, and remove pmoutils copy from Dockerfile as it appears unused.
2026-03-24 15:35:21 +01:00

119 lines
3.3 KiB
Docker

# ===================================
# Stage 1: Build Vue.js webapp
# ===================================
FROM node:22-alpine AS webapp-builder
WORKDIR /webapp
# Copy webapp package files
COPY pmoapp/webapp/package*.json ./
# Install dependencies
RUN npm ci --production=false
# Copy webapp source
COPY pmoapp/webapp/ ./
# Build the webapp
RUN npm run build
# ===================================
# Stage 2: Build Rust binary
# ===================================
FROM rustlang/rust:nightly-bookworm AS rust-builder
WORKDIR /build
# Install system dependencies for building
RUN apt-get update && apt-get install -y \
libsoxr-dev \
libasound2-dev \
pkg-config \
cmake \
&& rm -rf /var/lib/apt/lists/*
# Copy Cargo workspace files
COPY Cargo.toml Cargo.lock ./
# Copy all crates
COPY PMOMusic/ ./PMOMusic/
COPY pmoupnp/ ./pmoupnp/
COPY pmomediarenderer/ ./pmomediarenderer/
COPY pmomediaserver/ ./pmomediaserver/
COPY pmoconfig/ ./pmoconfig/
COPY pmodidl/ ./pmodidl/
COPY pmoserver/ ./pmoserver/
COPY pmocache/ ./pmocache/
COPY pmocovers/ ./pmocovers/
COPY pmoaudiocache/ ./pmoaudiocache/
COPY pmoaudio/ ./pmoaudio/
COPY pmoqobuz/ ./pmoqobuz/
COPY pmoparadise/ ./pmoparadise/
COPY pmoradiofrance/ ./pmoradiofrance/
COPY pmowebrenderer/ ./pmowebrenderer/
COPY pmosource/ ./pmosource/
COPY pmoplaylist/ ./pmoplaylist/
COPY pmoflac/ ./pmoflac/
COPY pmometadata/ ./pmometadata/
COPY pmocontrol/ ./pmocontrol/
COPY pmoaudio-ext/ ./pmoaudio-ext/
COPY pmoapp/ ./pmoapp/
# Copy the webapp dist from previous stage
COPY --from=webapp-builder /webapp/dist ./pmoapp/webapp/dist/
# Build the Rust binary in release mode
RUN cargo build --release --bin PMOMusic
# Strip debug symbols to reduce binary size
RUN strip /build/target/release/PMOMusic
# ===================================
# Stage 3: Minimal runtime image
# ===================================
FROM debian:bookworm-slim
ARG BUILD_DATE
LABEL org.opencontainers.image.created=$BUILD_DATE
LABEL org.opencontainers.image.title="PMOMusic UPNP Music Server"
LABEL org.opencontainers.image.version="0.1"
LABEL org.opencontainers.image.authors="eric@coissac.eu"
LABEL org.opencontainers.image.licenses="CeCILL-2.0"
LABEL org.opencontainers.image.url="https://gargoton.petite-maison-orange.fr/eric/pmomusic"
LABEL org.opencontainers.image.description="PMOMusic est une application Rust proposant en un binaire unique une Serveur de Musique, et une point de controle UPNP controlable via une application web."
# Install only runtime dependencies
RUN apt-get update && apt-get install -y \
libsoxr0 \
libasound2 \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# Create a non-root user
RUN useradd -m -u 1000 pmomusic
# Copy the binary from builder
COPY --from=rust-builder /build/target/release/PMOMusic /usr/local/bin/PMOMusic
# Set ownership
RUN chown pmomusic:pmomusic /usr/local/bin/PMOMusic
# Switch to non-root user
USER pmomusic
# Create directories for configuration and cache
RUN mkdir -p /home/pmomusic/.pmomusic
# Set working directory
WORKDIR /home/pmomusic
# Expose default port (adjust if needed)
EXPOSE 8080
# Health check (adjust the URL if needed)
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD ["/usr/local/bin/PMOMusic", "--help"] || exit 1
# Run the binary
ENTRYPOINT ["/usr/local/bin/PMOMusic"]