diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c1bbb47..9bea8fb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -300,13 +300,17 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 - name: Build Docker image - uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc + uses: docker/build-push-action@4a13e500e55cf31b7a5d59a38ab2040ab0f42f56 with: context: . push: false load: true tags: roapi:latest + cache-from: type=registry,ref=ghcr.io/${{ github.repository_owner }}/roapi:buildcache - name: Test run: | docker run --rm roapi:latest --help + docker run --rm roapi:latest --version diff --git a/.github/workflows/roapi_release.yml b/.github/workflows/roapi_release.yml index 474c5f3..77c3829 100644 --- a/.github/workflows/roapi_release.yml +++ b/.github/workflows/roapi_release.yml @@ -279,3 +279,5 @@ jobs: push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} + cache-from: type=registry,ref=ghcr.io/${{ github.repository_owner }}/roapi:buildcache + cache-to: type=registry,ref=ghcr.io/${{ github.repository_owner }}/roapi:buildcache,mode=max diff --git a/Dockerfile b/Dockerfile index 78dbf7e..1847656 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,18 +1,51 @@ -FROM instrumentisto/rust:nightly-bullseye-2023-09-15 AS builder -WORKDIR /roapi_src -COPY ./ /roapi_src +ARG RUST_VER=nightly-bullseye-2023-09-15 +ARG RUSTFLAGS='-C target-cpu=skylake' +ARG FEATURES="simd,database" + +# Step 0: Install cargo-chef +FROM instrumentisto/rust:${RUST_VER} AS chef +# We only pay the installation cost once, +# it will be cached from the second build onwards +RUN cargo +nightly install cargo-chef +# install cmake for snmalloc RUN apt-get update \ && apt-get install --no-install-recommends -y cmake -RUN RUSTFLAGS='-C target-cpu=skylake' \ - cargo +nightly install --locked --bins roapi --features "simd database" --path roapi +# Step 1: Compute a recipe file +FROM chef AS planner +WORKDIR /roapi_src +COPY . . +RUN cargo chef prepare --recipe-path recipe.json +# Step 2: Cache project dependencies +FROM chef AS cacher +ARG RUSTFLAGS +ARG FEATURES +WORKDIR /roapi_src +COPY --from=planner /roapi_src/recipe.json recipe.json +RUN RUSTFLAGS=${RUSTFLAGS} \ + cargo +nightly chef cook --features ${FEATURES} --release --recipe-path recipe.json + +# Step 3: Build the release binary +FROM chef AS builder +ARG RUSTFLAGS +ARG FEATURES +WORKDIR /roapi_src +COPY ./ /roapi_src +COPY --from=cacher /roapi_src/target target +COPY --from=cacher /usr/local/cargo /usr/local/cargo +RUN RUSTFLAGS=${RUSTFLAGS} \ + cargo +nightly build --release --locked --bin roapi --features ${FEATURES} + +# Step 4: Assemble the final image FROM debian:bullseye-slim LABEL org.opencontainers.image.source https://github.com/roapi/roapi -RUN apt-get update && apt-get install -y libssl-dev ca-certificates && rm -rf /var/lib/apt/lists/* +RUN apt-get update \ + && apt-get install -y libssl-dev ca-certificates \ + && rm -rf /var/lib/apt/lists/* COPY test_data /test_data -COPY --from=builder /usr/local/cargo/bin/roapi /usr/local/bin/roapi +COPY --from=builder /roapi_src/target/release/roapi /usr/local/bin/roapi EXPOSE 8080 ENTRYPOINT ["roapi"]