1# syntax=docker/dockerfile:1.7 2 3FROM debian:bookworm-slim AS ffmpeg 4RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ 5 --mount=type=cache,target=/var/lib/apt,sharing=locked \ 6 apt-get update && apt-get install -y --no-install-recommends \ 7 ca-certificates \ 8 curl \ 9 xz-utils \ 10 && rm -rf /var/lib/apt/lists/* 11RUN mkdir -p /tmp/ffmpeg \ 12 && curl -L https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz \ 13 | tar -xJ --strip-components=1 -C /tmp/ffmpeg 14 15FROM rust:1.81-slim AS builder 16RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ 17 --mount=type=cache,target=/var/lib/apt,sharing=locked \ 18 apt-get update && apt-get install -y --no-install-recommends pkg-config libssl-dev \ 19 && rm -rf /var/lib/apt/lists/* 20WORKDIR /app 21 22# leverage incremental builds by compiling deps first 23COPY Cargo.toml Cargo.lock ./ 24RUN mkdir src && echo "fn main() {}" > src/main.rs 25RUN --mount=type=cache,target=/usr/local/cargo/registry \ 26 --mount=type=cache,target=/app/target \ 27 cargo build --release 28RUN rm -rf src 29 30# now copy actual sources (binary output stored in image layer) 31COPY src ./src 32RUN --mount=type=cache,target=/usr/local/cargo/registry \ 33 cargo build --release 34 35FROM debian:bookworm-slim 36RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ 37 --mount=type=cache,target=/var/lib/apt,sharing=locked \ 38 apt-get update && apt-get install -y --no-install-recommends \ 39 ca-certificates \ 40 libssl3 \ 41 && rm -rf /var/lib/apt/lists/* 42 43COPY --from=ffmpeg /tmp/ffmpeg/ffmpeg /usr/local/bin/ffmpeg 44COPY --from=ffmpeg /tmp/ffmpeg/ffprobe /usr/local/bin/ffprobe 45COPY --from=builder /app/target/release/transcoder /usr/local/bin/transcoder 46 47ENV TRANSCODER_HOST=0.0.0.0 \ 48 TRANSCODER_PORT=8080 \ 49 TRANSCODER_MAX_UPLOAD_BYTES=536870912 50 51EXPOSE 8080 52CMD ["/usr/local/bin/transcoder"]