FROM rust:slim AS builder WORKDIR /app # Install a few dependencies RUN apt-get update && \ apt-get install -y --no-install-recommends \ git \ curl \ unzip && \ rm -rf /var/lib/apt/lists/* RUN rustup target add wasm32-unknown-unknown # Install dioxus-cli RUN curl -sSL https://dioxus.dev/install.sh | bash ENV DAISYUI_PATH=/opt/daisyui/daisyui/ ENV DAISYUI_THEME_PATH=/opt/daisyui/theme/ ENV NODE_PATH=$DAISYUI_PATH:$DAISYUI_THEME_PATH # Install DaisyUI bundles RUN mkdir -p $DAISYUI_PATH $DAISYUI_THEME_PATH && \ cd $DAISYUI_PATH && \ curl -sLO https://github.com/saadeghi/daisyui/releases/latest/download/daisyui.js && \ cd $DAISYUI_THEME_PATH && \ curl -sLO https://github.com/saadeghi/daisyui/releases/latest/download/daisyui-theme.js # Install Tailwind CSS CLI RUN curl -sLO https://github.com/tailwindlabs/tailwindcss/releases/latest/download/tailwindcss-linux-x64 && \ install tailwindcss-linux-x64 /usr/local/bin/tailwindcss && \ rm tailwindcss-linux-x64 # Include Rust binaries in PATH ENV PATH="/root/.cargo/bin:${PATH}" # Copy project dependency manifests COPY Cargo.toml Cargo.lock Dioxus.toml /app/ # Create dummy files to force cargo to build the dependencies # main() content fixes "failed to find intrinsics to enable `clone_ref` function" # See https://github.com/trunk-rs/trunk/issues/951#issuecomment-2816819963 RUN mkdir /app/src && \ echo "fn main() { dioxus::logger::initialize_default(); }" > /app/src/main.rs && \ echo "fn main() {}" > /app/src/build.rs # Prebuild dependencies RUN dx build --release --locked --web # Remove assets from the initial build RUN rm -rf /app/target/dx/libretunes/release/web/public RUN rm -rf /app/src COPY --exclude=assets/tailwind.css assets /app/assets COPY style /app/style COPY migrations /app/migrations COPY src /app/src # Copy necessary git files for getting build version RUN mkdir /app/.git COPY .git/HEAD .git/refs /app/.git # dx build will run tailwindcss anyways, but doing it first here is faster and clearer if it fails RUN tailwindcss --input style/tailwind.css --output assets/tailwind.css # Touch files to force rebuild RUN touch /app/src/main.rs && touch /app/src/build.rs # Actually build RUN dx build --release --locked --web # Use ldd to list all dependencies of the server, then copy them to /app/libs RUN mkdir /app/libs && ldd /app/target/dx/libretunes/release/web/server | grep "=> /" | \ awk '{print $3}' | xargs -I '{}' cp '{}' /app/libs # Build the final image FROM scratch LABEL license="MIT" LABEL description="LibreTunes, an open-source browser audio player and \ library manager built for collaborative listening." # Copy the binary and assets to the final image COPY --from=builder /app/target/dx/libretunes/release/web/server /libretunes COPY --from=builder /app/target/dx/libretunes/release/web/public /public ENV LIBRETUNES_SERVER_PUBLIC_PATH=/public ENV DIOXUS_PUBLIC_PATH=/public # Copy libraries to /lib64 COPY --from=builder /app/libs /lib64 COPY --from=builder /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2 ENV LD_LIBRARY_PATH=/lib64 EXPOSE 8080 ENTRYPOINT [ "/libretunes" ]