# stage 1 - Setup cargo-chef
FROM rust:1.68.0-alpine3.17 as planner

WORKDIR /app
COPY ./Cargo.toml ./Cargo.toml
COPY ./Cargo.lock ./Cargo.lock
COPY ./crates/nanocl_stubs/Cargo.toml ./crates/nanocl_stubs/Cargo.toml
COPY ./crates/nanocld_client/Cargo.toml ./crates/nanocld_client/Cargo.toml
COPY ./bin/nanocl/Cargo.toml ./bin/nanocl/Cargo.toml
COPY ./bin/nanocld/Cargo.toml ./bin/nanocld/Cargo.toml

# stage 3 - Build our project
FROM rust:1.68.0-alpine3.17 as builder

ARG channel=stable

## Build our nanocl daemon binary
COPY --from=planner /app /app
WORKDIR /app
RUN apk add musl-dev libpq-dev openssl git upx
COPY ./bin/nanocld/migrations ./bin/nanocld/migrations
COPY ./bin/nanocld/src ./bin/nanocld/src
COPY ./bin/nanocld/build.rs ./bin/nanocld/build.rs
COPY ./crates/nanocl_stubs/src ./crates/nanocl_stubs/src
COPY ./crates/nanocld_client/src ./crates/nanocld_client/src
COPY ./bin/nanocl/src ./bin/nanocl/src
COPY ./bin/nanocl/build.rs ./bin/nanocl/build.rs
COPY .git ./.git
ENV RUSTFLAGS="-C target-feature=-crt-static"
ENV NANOCL_CHANNEL=$channel
RUN cargo build --release --bin nanocld

## Compress the binary
RUN upx /app/target/release/nanocld

# stage 4 - Create runtime image
FROM alpine:3.17.2

## Install dependencies
RUN apk update && apk upgrade
RUN apk add libgcc libpq util-linux inotify-tools bash cloud-utils cdrkit

## Copy the binary
COPY --from=builder /app/target/release/nanocld /usr/local/bin/nanocld
COPY ./bin/nanocld/entrypoint.sh /entrypoint.sh

RUN chmod +x /entrypoint.sh

## Set entrypoint
ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]
