# syntax=docker/dockerfile:1.3
# Based on https://levelup.gitconnected.com/1940db638a6c
#
# We don't do cross compilation at the moment but build the dependencies first
# anyway to get the ability to increment.
# ---------------------------------------------------------------------------
# Builder
# ---------------------------------------------------------------------------
# Use ubuntu:noble as the base image
FROM ubuntu:noble AS builder
# Install Rust toolchain and dependencies for compilation of C code (e.g., rocksdb)
RUN apt-get update && \
apt-get install -y unzip wget curl build-essential clang librocksdb-dev libsqlite3-dev && \
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y && \
. $HOME/.cargo/env && \
rustup component add rustfmt
# Install build dependency `protoc`.
COPY utils/install-protoc.sh /tmp
RUN PREFIX=/usr/local bash /tmp/install-protoc.sh
# Now for the two-step building.
#
# Set initial workdir.
WORKDIR /usr/src
# Create blank project.
RUN USER=root /root/.cargo/bin/cargo new annonars
# We want dependencies cached, so copy those first.
COPY Cargo.toml Cargo.lock /usr/src/annonars/
RUN touch /usr/src/annonars/src/lib.rs
# Set the working directory.
WORKDIR /usr/src/annonars
# Copy in the rest of the sources.
COPY build.rs Cargo.toml Cargo.lock /usr/src/annonars/
COPY src /usr/src/annonars/src/
COPY protos /usr/src/annonars/protos/
COPY utils/alpine-linker-script.sh /usr/src/annonars/utils/
RUN chmod a+rx /usr/src/annonars/utils/alpine-linker-script.sh
COPY .cargo /usr/src/annonars/.cargo/
# Touch main.rs to prevent cached release build.
RUN touch /usr/src/annonars/src/main.rs
# Build the application
RUN /root/.cargo/bin/cargo build --release
# ---------------------------------------------------------------------------
# Runtime
# ---------------------------------------------------------------------------
FROM ubuntu:noble AS runtime
# Install dependencies (and cleanup afterward)
RUN apt-get update && \
apt-get install -y librocksdb8.9 libsqlite3-0 && \
apt-get clean autoclean && \
apt-get autoremove --yes && \
rm -rf /var/lib/{apt,dpkg,cache,log}
# Copy application binary from builder image
COPY --from=builder \
/usr/src/annonars/target/release/annonars \
/usr/local/bin
# Copy the entrypoint script and make it executable.
COPY utils/docker/entrypoint.sh /
RUN chmod a+rx /entrypoint.sh
# Set the entrypoint.
ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]
# Expose the application port
EXPOSE 8080