# syntax=docker/dockerfile:1 FROM rust:1-bookworm AS rust-deps RUN apt-get update && apt-get install -y --no-install-recommends \ pkg-config \ libssl-dev \ cmake \ perl \ git \ curl \ ca-certificates \ unzip \ && rm -rf /var/lib/apt/lists/* RUN curl -fsSL https://bun.sh/install | bash ENV BUN_INSTALL=/root/.bun ENV PATH=$BUN_INSTALL/bin:$PATH WORKDIR /build COPY Cargo.toml Cargo.lock ./ FROM rust-deps AS builder COPY lib ./lib COPY app ./app COPY web ./web COPY admin ./admin RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/usr/local/cargo/git \ --mount=type=cache,target=/build/target \ rm -rf /build/target/release/build/web-* /build/target/release/build/admin-web-* \ /build/target/release/deps/web-* /build/target/release/deps/admin_web-* 2>/dev/null; \ cargo build --release --workspace --bins && \ mkdir -p /out && \ for b in apihost githost synchost mails migrate openapi im adminhost webhook runner aihost; do \ cp "target/release/$b" /out/; \ done # The runner shells out to `docker run` for `container:` jobs; ship just the # static CLI so the image stays daemon-free. RUN curl -fsSL "https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/docker-27.3.1.tgz" -o /tmp/docker.tgz \ && tar -xzf /tmp/docker.tgz -C /tmp \ && cp /tmp/docker/docker /out/docker \ && rm -rf /tmp/docker /tmp/docker.tgz ########## runtime ########## FROM debian:bookworm-slim # git: githost/synchost spawn system git; openssh-client: ssh-keygen for host key RUN apt-get update && apt-get install -y --no-install-recommends \ git \ ca-certificates \ libssl3 \ openssh-client \ && rm -rf /var/lib/apt/lists/* \ && useradd --system --create-home --uid 10001 gitdata \ && mkdir -p /opt/gitdata/repos /opt/gitdata/objects /var/lib/gitdata-runner \ && chown -R gitdata:gitdata /opt/gitdata /var/lib/gitdata-runner WORKDIR /app COPY --chown=gitdata:gitdata config/default.toml config/default.toml COPY --from=builder /out/apihost /out/githost /out/synchost /out/mails /out/migrate /out/openapi /out/im /out/adminhost /out/webhook /out/runner /out/aihost /usr/local/bin/ COPY --from=builder /out/docker /usr/local/bin/docker USER gitdata EXPOSE 3000 9418 22 3001 3002 3003 3004 3005 3006 CMD ["apihost"]