Files
ystp/docker/Dockerfile
237899745 500a8f7ecd
Some checks failed
CI / verify (push) Has been cancelled
fix: make migration checksums reproducible
2026-07-25 21:52:20 +08:00

80 lines
2.2 KiB
Docker

# syntax=docker/dockerfile:1.7
FROM rust:1.92-trixie AS builder
ARG DEBIAN_MIRROR=http://deb.debian.org/debian
ARG CARGO_REGISTRY_MIRROR=
WORKDIR /app
RUN sed -i "s|http://deb.debian.org/debian|${DEBIAN_MIRROR%/}|g" /etc/apt/sources.list.d/debian.sources \
&& DEBIAN_FRONTEND=noninteractive apt-get update \
&& apt-get install -y --no-install-recommends \
cmake \
libdav1d-dev \
nasm \
pkg-config \
&& rm -rf /var/lib/apt/lists/*
COPY Cargo.toml Cargo.lock ./
COPY build.rs ./
COPY .cargo ./.cargo
COPY src ./src
COPY migrations ./migrations
COPY templates ./templates
# SQLx hashes migration bytes at compile time. Production was initialized from
# CRLF migrations, so make every build reproduce those historical checksums.
RUN sed -i 's/\r$//; s/$/\r/' migrations/*.sql
RUN --mount=type=cache,target=/usr/local/cargo/registry,sharing=locked \
--mount=type=cache,target=/app/target,sharing=locked \
if [ -n "$CARGO_REGISTRY_MIRROR" ]; then \
printf '\n[source.crates-io]\nreplace-with = "deployment-mirror"\n\n[source.deployment-mirror]\nregistry = "%s"\n' \
"$CARGO_REGISTRY_MIRROR" >> .cargo/config.toml; \
fi \
&& cargo build --release --locked \
&& cp /app/target/release/imageforge /app/imageforge
FROM node:22-alpine AS frontend-builder
WORKDIR /app/frontend
COPY frontend/package*.json ./
RUN --mount=type=cache,target=/root/.npm,sharing=locked npm ci
COPY frontend ./
RUN npm run build
FROM debian:trixie-slim
ARG DEBIAN_MIRROR=http://deb.debian.org/debian
RUN sed -i "s|http://deb.debian.org/debian|${DEBIAN_MIRROR%/}|g" /etc/apt/sources.list.d/debian.sources \
&& DEBIAN_FRONTEND=noninteractive apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates \
curl \
libdav1d7 \
&& rm -rf /var/lib/apt/lists/*
RUN groupadd --system --gid 10001 imageforge \
&& useradd --system --uid 10001 --gid imageforge --home-dir /app --shell /usr/sbin/nologin imageforge
WORKDIR /app
COPY --from=builder /app/imageforge ./imageforge
COPY --from=frontend-builder /app/frontend/dist ./static
COPY --from=builder /app/migrations ./migrations
RUN mkdir -p uploads \
&& chown imageforge:imageforge uploads
ENV HOST=0.0.0.0
ENV PORT=8080
EXPOSE 8080
USER 10001:10001
CMD ["./imageforge"]