music on atproto
plyr.fm
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"]