diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..5eb9247 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,42 @@ +# Dockerfile + +# ---- Planner Stage ---- +# Use the official Rust Alpine image as a base for planning. +# We use the same base image for planner and builder for consistency. +FROM rust:1-alpine AS planner +WORKDIR /app +# Install cargo-chef for build caching +RUN apk add --no-cache musl-dev # Needed by chef +RUN cargo install cargo-chef --locked +COPY . . +# Compute dependencies. This output will be cached if Cargo.toml/lock haven't changed. +RUN cargo chef prepare --recipe-path recipe.json + +# ---- Builder Stage ---- +# Use the same Rust Alpine image for building. +FROM rust:1-alpine AS builder +WORKDIR /app +# Install build dependencies for Alpine +RUN apk add --no-cache build-base openssl-dev pkgconfig +# Install cargo-chef again (could optimize but simpler this way) +RUN cargo install cargo-chef --locked +# Copy the dependency recipe from the planner stage +COPY --from=planner /app/recipe.json recipe.json +# Build dependencies based on the recipe. This layer is cached efficiently. +RUN cargo chef cook --release --recipe-path recipe.json +# Copy application code +COPY . . +# Build the application binary, linking against pre-built dependencies +# Ensure the binary name matches your package name in Cargo.toml +RUN cargo build --release --bin discord-music-bot-lavalink-rs + +# ---- Runtime Stage ---- +# Use a minimal Alpine image for the final runtime environment. +FROM alpine:latest +WORKDIR /app +# Install runtime dependencies needed by the binary (e.g., SSL certs) +RUN apk add --no-cache ca-certificates openssl +# Copy the compiled application binary from the builder stage +COPY --from=builder /app/target/release/discord-music-bot-lavalink-rs /app/ +# Set the binary as the entrypoint +CMD ["./discord-music-bot-lavalink-rs"] \ No newline at end of file