FROM rust:latest AS deps WORKDIR /build # protobuf compiler for tonic-build RUN apt-get update && apt-get install -y protobuf-compiler && rm -rf /var/lib/apt/lists/* # Copy dependency manifests, vendored crates, and proto files first (cached layer) COPY Cargo.toml Cargo.lock build.rs ./ COPY proto/ proto/ COPY vendor/ vendor/ # Set up vendored dependency resolution RUN mkdir -p .cargo && \ printf '[registries.sunbeam]\nindex = "sparse+https://src.sunbeam.pt/api/packages/studio/cargo/"\n\n[source.crates-io]\nreplace-with = "vendored-sources"\n\n[source."sparse+https://src.sunbeam.pt/api/packages/studio/cargo/"]\nregistry = "sparse+https://src.sunbeam.pt/api/packages/studio/cargo/"\nreplace-with = "vendored-sources"\n\n[source.vendored-sources]\ndirectory = "vendor/"\n' \ > .cargo/config.toml # Build deps only with a dummy main.rs — this layer is cached until Cargo.toml/vendor change RUN mkdir -p src && echo "fn main(){}" > src/main.rs && \ cargo build --release --target x86_64-unknown-linux-gnu && \ rm src/main.rs && rm target/x86_64-unknown-linux-gnu/release/sol FROM deps AS builder # Copy actual source — only Sol code recompiles, deps are cached COPY src/ src/ # Touch source to ensure cargo detects changes (COPY preserves host mtimes) RUN find src/ -name '*.rs' -exec touch {} + && \ cargo build --release --target x86_64-unknown-linux-gnu FROM gcr.io/distroless/cc-debian12:nonroot COPY --from=builder /build/target/x86_64-unknown-linux-gnu/release/sol / ENTRYPOINT ["/sol"]