Skip to content

Commit 399084a

Browse files
fix: fetch per arch, locked, and explicit import
1 parent 3109c7c commit 399084a

File tree

2 files changed

+34
-24
lines changed

2 files changed

+34
-24
lines changed

.dockerignore

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1-
target
2-
.github
3-
.git
4-
.vscode
5-
Dockerfile
1+
# Ignore all
2+
*
3+
4+
# And explicitely allow...
5+
!/.cargo
6+
!/build-scripts
7+
!/Cargo.lock
8+
!/Cargo.toml
9+
!/src

Dockerfile

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ FROM --platform=${BUILDPLATFORM} rust:1.89.0-trixie@sha256:26318aeddc7e7335b55ab
33

44
ARG APPLICATION_NAME
55

6-
ENV DEBIAN_FRONTEND=noninteractive
7-
86
RUN rm -f /etc/apt/apt.conf.d/docker-clean \
97
&& echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache
108

9+
ARG DEBIAN_FRONTEND=noninteractive
10+
1111
# borrowed (Ba Dum Tss!) from
1212
# https://github.com/pablodeymo/rust-musl-builder/blob/7a7ea3e909b1ef00c177d9eeac32d8c9d7d6a08c/Dockerfile#L48-L49
1313
RUN --mount=type=cache,id=apt-cache,target=/var/cache/apt,sharing=locked \
@@ -18,21 +18,6 @@ RUN --mount=type=cache,id=apt-cache,target=/var/cache/apt,sharing=locked \
1818
build-essential \
1919
musl-dev
2020

21-
# The following block
22-
# creates an empty app, and we copy in Cargo.toml and Cargo.lock as they represent our dependencies
23-
# This allows us to copy in the source in a different layer which in turn allows us to leverage Docker's layer caching
24-
# That means that if our dependencies don't change rebuilding is much faster
25-
WORKDIR /build
26-
27-
RUN cargo init --name ${APPLICATION_NAME}
28-
29-
COPY ./.cargo ./Cargo.toml ./Cargo.lock ./
30-
31-
# We use `fetch` to pre-download the files to the cache
32-
RUN --mount=type=cache,id=cargo-git,target=/usr/local/cargo/git/db,sharing=locked \
33-
--mount=type=cache,id=cargo-registry,target=/usr/local/cargo/registry,sharing=locked \
34-
cargo fetch
35-
3621
FROM rust-base AS rust-linux-amd64
3722
ARG TARGET=x86_64-unknown-linux-musl
3823

@@ -41,16 +26,37 @@ ARG TARGET=aarch64-unknown-linux-musl
4126

4227
FROM rust-${TARGETPLATFORM//\//-} AS rust-cargo-build
4328

44-
ENV DEBIAN_FRONTEND=noninteractive
45-
4629
COPY ./build-scripts /build-scripts
4730

31+
ARG DEBIAN_FRONTEND=noninteractive
32+
4833
RUN --mount=type=cache,id=apt-cache-${TARGET},from=rust-base,target=/var/cache/apt,sharing=locked \
4934
--mount=type=cache,id=apt-lib-${TARGET},from=rust-base,target=/var/lib/apt,sharing=locked \
5035
/build-scripts/setup-env.sh
5136

5237
RUN rustup target add ${TARGET}
5338

39+
# The following block
40+
# creates an empty app, and we copy in Cargo.toml and Cargo.lock as they represent our dependencies
41+
# This allows us to copy in the source in a different layer which in turn allows us to leverage Docker's layer caching
42+
# That means that if our dependencies don't change rebuilding is much faster
43+
WORKDIR /build
44+
45+
RUN cargo init --name ${APPLICATION_NAME}
46+
47+
COPY ./.cargo ./Cargo.toml ./Cargo.lock ./
48+
49+
# We use `fetch` to pre-download the files to the cache
50+
# Notice we do this in the target arch specific branch
51+
# We do this because we want to do it after `setup-env.sh`,
52+
# as the env is less likely to change than the code
53+
# We do lock the cache, to avoid corruption when building it for
54+
# both target platforms. It doesn't matter, as after unlocking the other one
55+
# just validates, but doesn't need to download anything
56+
RUN --mount=type=cache,id=cargo-git,target=/usr/local/cargo/git/db,sharing=locked \
57+
--mount=type=cache,id=cargo-registry,target=/usr/local/cargo/registry,sharing=locked \
58+
cargo fetch
59+
5460
RUN --mount=type=cache,target=/build/target/${TARGET},sharing=locked \
5561
--mount=type=cache,id=cargo-git,target=/usr/local/cargo/git/db \
5662
--mount=type=cache,id=cargo-registry,target=/usr/local/cargo/registry \

0 commit comments

Comments
 (0)