From 7edbe11eb8316112d1de95c8df48ecf932904e13 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Sun, 8 Jun 2025 23:45:55 +0000 Subject: [PATCH] docker: Dedup cargo and chef dockerfiles. Signed-off-by: Jason Volk --- docker/Dockerfile.cargo | 59 +++++++++++++++++++++---- docker/Dockerfile.cargo.deps | 84 ------------------------------------ docker/Dockerfile.source | 7 +-- docker/bake.hcl | 55 ++++++++++++++--------- 4 files changed, 85 insertions(+), 120 deletions(-) delete mode 100644 docker/Dockerfile.cargo.deps diff --git a/docker/Dockerfile.cargo b/docker/Dockerfile.cargo index 93cd26b3..f711b431 100644 --- a/docker/Dockerfile.cargo +++ b/docker/Dockerfile.cargo @@ -4,6 +4,7 @@ FROM input AS cargo ARG sys_target ARG rust_target ARG rust_toolchain +ARG RUST_HOME ARG RUSTUP_HOME ARG CARGO_HOME ARG CARGO_TARGET @@ -11,25 +12,56 @@ ARG CARGO_TARGET_DIR ARG cargo_target_profile ARG cargo_target_artifact ARG cargo_target_share +ARG CARGO_TERM_VERBOSE=0 +ARG RUST_BACKTRACE +ARG JEMALLOC_OVERRIDE +ARG ROCKSDB_LIB_DIR +ARG CARGO_BUILD_RUSTFLAGS +ARG CARGO_PROFILE_TEST_DEBUG +ARG CARGO_PROFILE_TEST_INCREMENTAL +ARG CARGO_PROFILE_BENCH_DEBUG +ARG CARGO_PROFILE_BENCH_LTO +ARG CARGO_PROFILE_RELEASE_LTO +ARG CARGO_PROFILE_RELEASE_DEBUGINFO_DEBUG +ARG CARGO_PROFILE_RELEASE_DEBUGINFO_LTO ARG cargo_profile ARG cargo_features ARG cargo_spec_features ARG cargo_cmd +ARG color_args="--color always" +ARG recipe_args="" ARG cargo_args="" +ARG git_checkout WORKDIR / COPY --link --from=input . . +COPY --link --from=rust ${RUST_HOME} ${RUST_HOME} +COPY --link --from=deps /usr/src/tuwunel /usr/src/tuwunel WORKDIR /usr/lib/${sys_target} COPY --link --from=rocksdb . . WORKDIR /usr/src/tuwunel +ENV PATH="${CARGO_HOME}/bin:$PATH" +ENV CARGO_TERM_VERBOSE="${CARGO_TERM_VERBOSE}" +ENV RUST_BACKTRACE="${RUST_BACKTRACE}" +ENV JEMALLOC_OVERRIDE="${JEMALLOC_OVERRIDE}" +ENV ROCKSDB_LIB_DIR="${ROCKSDB_LIB_DIR}" +ENV CARGO_PROFILE_TEST_DEBUG="${CARGO_PROFILE_TEST_DEBUG}" +ENV CARGO_PROFILE_TEST_INCREMENTAL="${CARGO_PROFILE_TEST_INCREMENTAL}" +ENV CARGO_PROFILE_BENCH_DEBUG="${CARGO_PROFILE_BENCH_DEBUG}" +ENV CARGO_PROFILE_BENCH_LTO="${CARGO_PROFILE_BENCH_LTO}" +ENV CARGO_PROFILE_RELEASE_LTO="${CARGO_PROFILE_RELEASE_LTO}" +ENV CARGO_PROFILE_RELEASE_DEBUGINFO_DEBUG="${CARGO_PROFILE_RELEASE_DEBUGINFO_DEBUG}" +ENV CARGO_PROFILE_RELEASE_DEBUGINFO_LTO="${CARGO_PROFILE_RELEASE_DEBUGINFO_LTO}" +ENV CARGO_BUILD_RUSTFLAGS="${CARGO_BUILD_RUSTFLAGS}" +ENV CARGO_TARGET_DIR="${CARGO_TARGET_DIR}" ENV targ_dir="${CARGO_TARGET_DIR}/${cargo_target_profile}" ENV targ_targ_dir="${CARGO_TARGET_DIR}/${rust_target}/${cargo_target_profile}" RUN \ ---mount=type=cache,dst=${RUSTUP_HOME}/downloads,sharing=shared \ ---mount=type=cache,dst=${CARGO_HOME}/registry,sharing=shared \ ---mount=type=cache,dst=${CARGO_HOME}/git,sharing=shared \ +--mount=type=cache,dst=${RUSTUP_HOME}/downloads,sharing=shared,ro \ +--mount=type=cache,dst=${CARGO_HOME}/registry,sharing=shared,ro \ +--mount=type=cache,dst=${CARGO_HOME}/git,sharing=shared,ro \ --mount=type=cache,dst=${targ_dir}/deps,id=${cargo_target_share}/deps,sharing=locked \ --mount=type=cache,dst=${targ_dir}/build,id=${cargo_target_share}/build,sharing=locked \ --mount=type=cache,dst=${targ_dir}/examples,id=${cargo_target_share}/examples,sharing=locked \ @@ -48,11 +80,20 @@ RUN \ --locked \ --workspace \ "${cargo_spec_features}" \ - --features "${cargo_features}" \ - --profile "${cargo_profile}" \ - --target "${CARGO_TARGET}" \ - --target-dir "${CARGO_TARGET_DIR}" \ - --manifest-path Cargo.toml \ - --color always \ + "--features=${cargo_features}" \ + "--profile=${cargo_profile}" \ + "--target=${CARGO_TARGET}" \ + "--target-dir=${CARGO_TARGET_DIR}" \ + "--manifest-path=Cargo.toml" \ + ${recipe_args} \ + ${color_args} \ ${cargo_args} + + # If this image is further reused with other cargo commands, all + # modifications made by cargo chef cook outside of target-dir have to be + # cleared. If not, resulting build artifacts will link incorrectly, even + # without error. For example, a target executable may be produced which + # does nothing except exit(0). If you have observed a smoketest failing in + # such a manner, investigate this as a cause of the issue. + git restore -W -S --source=${git_checkout} . EOF diff --git a/docker/Dockerfile.cargo.deps b/docker/Dockerfile.cargo.deps deleted file mode 100644 index 2739bff1..00000000 --- a/docker/Dockerfile.cargo.deps +++ /dev/null @@ -1,84 +0,0 @@ -# syntax = docker/dockerfile:1.11-labs - -FROM input AS deps -ARG sys_target -ARG rust_target -ARG rust_toolchain -ARG RUSTUP_HOME -ARG CARGO_HOME -ARG CARGO_TARGET -ARG CARGO_TARGET_DIR -ARG cargo_target_profile -ARG cargo_target_artifact -ARG cargo_target_share -ARG CARGO_BUILD_RUSTFLAGS -ARG CARGO_PROFILE_TEST_DEBUG -ARG CARGO_PROFILE_TEST_INCREMENTAL -ARG CARGO_PROFILE_BENCH_DEBUG -ARG CARGO_PROFILE_BENCH_LTO -ARG CARGO_PROFILE_RELEASE_LTO -ARG CARGO_PROFILE_RELEASE_DEBUGINFO_DEBUG -ARG CARGO_PROFILE_RELEASE_DEBUGINFO_LTO -ARG cargo_profile -ARG cargo_features -ARG cargo_spec_features -ARG cook_args -ARG git_checkout - -WORKDIR / -COPY --link --from=input . . - -WORKDIR /usr/lib/${sys_target} -COPY --link --from=rocksdb . . - -WORKDIR /usr/src/tuwunel -COPY --link --from=recipe recipe.json . - -ENV CARGO_PROFILE_TEST_DEBUG="${CARGO_PROFILE_TEST_DEBUG}" -ENV CARGO_PROFILE_TEST_INCREMENTAL="${CARGO_PROFILE_TEST_INCREMENTAL}" -ENV CARGO_PROFILE_BENCH_DEBUG="${CARGO_PROFILE_BENCH_DEBUG}" -ENV CARGO_PROFILE_BENCH_LTO="${CARGO_PROFILE_BENCH_LTO}" -ENV CARGO_PROFILE_RELEASE_LTO="${CARGO_PROFILE_RELEASE_LTO}" -ENV CARGO_PROFILE_RELEASE_DEBUGINFO_DEBUG="${CARGO_PROFILE_RELEASE_DEBUGINFO_DEBUG}" -ENV CARGO_PROFILE_RELEASE_DEBUGINFO_LTO="${CARGO_PROFILE_RELEASE_DEBUGINFO_LTO}" -ENV CARGO_BUILD_RUSTFLAGS="${CARGO_BUILD_RUSTFLAGS}" -ENV CARGO_TARGET_DIR="${CARGO_TARGET_DIR}" -ENV targ_dir="${CARGO_TARGET_DIR}/${cargo_target_profile}" -ENV targ_targ_dir="${CARGO_TARGET_DIR}/${rust_target}/${cargo_target_profile}" -RUN \ ---mount=type=cache,dst=${RUSTUP_HOME}/downloads,sharing=shared \ ---mount=type=cache,dst=${CARGO_HOME}/registry,sharing=shared \ ---mount=type=cache,dst=${CARGO_HOME}/git,sharing=shared \ ---mount=type=cache,dst=${targ_dir}/deps,id=${cargo_target_share}/deps,sharing=locked \ ---mount=type=cache,dst=${targ_dir}/build,id=${cargo_target_share}/build,sharing=locked \ ---mount=type=cache,dst=${targ_dir}/examples,id=${cargo_target_share}/examples,sharing=locked \ ---mount=type=cache,dst=${targ_dir}/incremental,id=${cargo_target_share}/incremental,sharing=locked \ ---mount=type=cache,dst=${targ_dir}/.fingerprint,id=${cargo_target_share}/fingerprint,sharing=locked \ ---mount=type=cache,dst=${targ_targ_dir}/deps,id=${cargo_target_share}/deps,sharing=locked \ ---mount=type=cache,dst=${targ_targ_dir}/build,id=${cargo_target_share}/build,sharing=locked \ ---mount=type=cache,dst=${targ_targ_dir}/examples,id=${cargo_target_share}/examples,sharing=locked \ ---mount=type=cache,dst=${targ_targ_dir}/incremental,id=${cargo_target_share}/incremental,sharing=locked \ ---mount=type=cache,dst=${targ_targ_dir}/.fingerprint,id=${cargo_target_share}/fingerprint,sharing=locked \ -<