annonars 0.42.3

Genome annotation based on Rust and RocksDB
# 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