mensa-upb-api/Dockerfile

69 lines
1.8 KiB
Docker

# -----------------------------
# Chef base
# -----------------------------
FROM rust:alpine AS chef
# SQLx offline mode
ENV SQLX_OFFLINE true
# Alpine build dependencies
RUN apk add --no-cache curl bash musl-dev openssl-dev pkgconfig
# Install cargo-chef
RUN curl -L --proto '=https' --tlsv1.2 -sSf \
https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash
RUN cargo binstall cargo-chef -y
WORKDIR /app
# -----------------------------
# Planner
# -----------------------------
FROM chef AS planner
COPY . .
RUN OFFLINE=true cargo chef prepare --recipe-path recipe.json
# -----------------------------
# Builder
# -----------------------------
FROM chef AS builder
COPY --from=planner /app/recipe.json recipe.json
RUN cargo chef cook --release --recipe-path recipe.json
COPY . .
RUN OFFLINE=true cargo build --release \
--bin mensa-upb-api \
--bin mensa-upb-scraper
# =====================================================
# Runtime image: scraper (cron-based)
# =====================================================
FROM alpine:latest AS scraper-runtime
WORKDIR /app
RUN apk add --no-cache ca-certificates tzdata dcron tini
RUN echo "0 0/8 * * * /app/mensa-upb-scraper >> /var/log/cron.log 2>&1" \
> /etc/crontabs/root && \
touch /var/log/cron.log
COPY --from=builder /app/target/release/mensa-upb-scraper /app/mensa-upb-scraper
ENTRYPOINT ["/sbin/tini", "--"]
CMD sh -c 'env > /etc/environment && crond -l 2 && tail -f /var/log/cron.log'
# =====================================================
# Runtime image: API
# =====================================================
FROM alpine:latest AS api-runtime
ARG UID=10001
RUN adduser -D -H -u "${UID}" appuser
USER appuser
COPY --from=builder /app/target/release/mensa-upb-api /bin/mensa-upb-api
ENV API_INTERFACE=0.0.0.0
EXPOSE 8080
CMD ["/bin/mensa-upb-api"]