/ Dockerfile
Dockerfile
 1  # syntax=docker/dockerfile:1.20
 2  FROM --platform=$BUILDPLATFORM tonistiigi/xx:1.9.0 AS xx
 3  
 4  FROM --platform=$BUILDPLATFORM node:25-slim AS ui
 5  
 6  WORKDIR /volume
 7  ENV PNPM_HOME="/pnpm"
 8  ENV PATH="$PNPM_HOME:$PATH"
 9  
10  RUN npm install -g pnpm
11  
12  COPY --parents capsule/ ./
13  
14  RUN cd capsule && \
15      pnpm install --frozen-lockfile && \
16      pnpm run build
17  
18  FROM --platform=$BUILDPLATFORM rust:1.94 AS builder
19  
20  COPY --from=xx / /
21  
22  WORKDIR /volume
23  ENV RUSTFLAGS="-C target-feature=+crt-static"
24  ENV XX_VERIFY_STATIC=1
25  
26  RUN apt-get update && \
27      apt-get install -y clang lld
28  
29  ARG TARGETPLATFORM
30  
31  RUN xx-apt-get install -y xx-c-essentials
32  
33  COPY --parents capsule/ capsule-cli/ Cargo.lock Cargo.toml ./
34  COPY --parents --from=ui /volume/capsule/assets ./
35  
36  RUN xx-cargo build --release --bin capsule && \
37      xx-verify target/$(xx-cargo --print-target-triple)/release/capsule && \
38      mkdir dist && \
39      cp target/$(xx-cargo --print-target-triple)/release/capsule dist/capsule
40  
41  FROM --platform=$BUILDPLATFORM alpine:3 AS newuser
42  
43  RUN echo "capsule:x:1000:" > /tmp/group && \
44      echo "capsule:x:1000:1000::/dev/null:/sbin/nologin" > /tmp/passwd && \
45      mkdir -p /tmp/var/lib/capsule && \
46      chown 1000:1000 /tmp/var/lib/capsule
47  
48  FROM scratch
49  
50  COPY --from=builder /volume/dist/capsule /bin/
51  COPY --from=newuser /tmp/group /tmp/passwd /etc/
52  COPY --from=newuser /tmp/var/lib /var/lib/
53  
54  ENV CAPSULE_DATA_DIR=/var/lib/capsule
55  
56  EXPOSE 8080
57  USER capsule
58  
59  ENTRYPOINT ["/bin/capsule"]