# Build. rusqlite is bundled (compiles SQLite from source) and librqbit needs a C # toolchain, so the builder needs cc. TLS is rustls throughout, so no OpenSSL headers. # The pages are ipx-web's (Dockerfile.web), so no node here (#203). FROM rust:1-slim-trixie AS build RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ && rm -rf /var/lib/apt/lists/* WORKDIR /src COPY Cargo.toml Cargo.lock ./ COPY crates ./crates # ipx builds the directory crate in, whose public pages serve these (#215). COPY web/logo.svg web/logo-dark.svg web/favicon.png ./web/ # cargo's registry and target/ are BuildKit cache mounts, kept in the builder between builds, so # a Cargo.lock change compiles only the crates that changed (#438): a dependency layer of stub # crates went with any change to it and compiled all 500 again, holding the builder's memory cap # for minutes. A cache mount is not part of the image, so the binary is copied out in the same # step. The workspace's own crates are touched because cargo goes by mtimes and skips a rebuild # if they look untouched. RUN --mount=type=cache,id=ipx-cargo-registry,target=/usr/local/cargo/registry,sharing=locked \ --mount=type=cache,id=ipx-target,target=/src/target,sharing=locked \ touch crates/ipx/src/main.rs crates/ipx/src/lib.rs crates/feed/src/lib.rs \ crates/directory/src/lib.rs \ && cargo build --release --locked -p ipx \ && cp target/release/ipxd /usr/local/bin/ipxd FROM debian:trixie-slim # ffmpeg is DeadAir's (#171): it finds the silences and copies the frames kept. Debian's adds # about 480 MB, once: the layer stays cached until the base image changes. RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates gosu ffmpeg \ && rm -rf /var/lib/apt/lists/* COPY --from=build /usr/local/bin/ipxd /usr/local/bin/ipxd COPY docker-entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/docker-entrypoint.sh ENV IPX_CONFIG=/config/config.toml \ IPX_DATA_DIR=/data \ IPX_LOG=ipx=info \ PUID=99 \ PGID=100 VOLUME ["/config", "/data", "/downloads"] # Web UI, and the BitTorrent peer port (TCP and UDP -- DHT needs the UDP side). EXPOSE 8099/tcp 6881/tcp 6881/udp ENTRYPOINT ["docker-entrypoint.sh"] CMD ["ipxd", "daemon"]