|
1 | 1 | # Multi-stage build for mcpls |
2 | | -# Build stage uses rust:1.85-slim, runtime uses debian:bookworm-slim |
| 2 | +# Build stage uses rust:1.88-slim, runtime uses debian:bookworm-slim |
3 | 3 |
|
4 | 4 | # Build stage |
5 | | -FROM rust:1.85-slim as builder |
| 5 | +FROM rust:1.88-slim AS builder |
6 | 6 |
|
7 | 7 | WORKDIR /app |
8 | 8 |
|
9 | | -# Copy workspace files |
| 9 | +# Cache dependencies separately from source code. |
| 10 | +# Copy manifests first, build a dummy main to populate the registry cache, |
| 11 | +# then overwrite with real sources. This layer is invalidated only when |
| 12 | +# Cargo.toml or Cargo.lock changes. |
10 | 13 | COPY Cargo.toml Cargo.lock ./ |
| 14 | +COPY crates/mcpls-core/Cargo.toml ./crates/mcpls-core/ |
| 15 | +COPY crates/mcpls-cli/Cargo.toml ./crates/mcpls-cli/ |
| 16 | +RUN mkdir -p crates/mcpls-core/src crates/mcpls-cli/src && \ |
| 17 | + echo "pub fn main() {}" > crates/mcpls-core/src/lib.rs && \ |
| 18 | + echo "fn main() {}" > crates/mcpls-cli/src/main.rs && \ |
| 19 | + cargo build --release --package mcpls && \ |
| 20 | + rm -rf crates/mcpls-core/src crates/mcpls-cli/src |
| 21 | + |
| 22 | +# Now copy real sources and rebuild only the changed crates |
11 | 23 | COPY crates/ ./crates/ |
12 | | - |
13 | | -# Build release binary |
14 | 24 | RUN cargo build --release --package mcpls |
15 | 25 |
|
16 | 26 | # Runtime stage |
17 | 27 | FROM debian:bookworm-slim |
18 | 28 |
|
19 | | -# Install runtime dependencies (CA certificates for HTTPS) |
20 | 29 | RUN apt-get update && apt-get install -y \ |
21 | 30 | ca-certificates \ |
22 | 31 | && rm -rf /var/lib/apt/lists/* |
23 | 32 |
|
24 | | -# Copy only the binary from builder stage |
25 | 33 | COPY --from=builder /app/target/release/mcpls /usr/local/bin/mcpls |
26 | 34 |
|
27 | | -# Create config directory |
28 | | -RUN mkdir -p /etc/mcpls |
| 35 | +RUN mkdir -p /etc/mcpls && \ |
| 36 | + useradd -m -u 1000 mcpls && \ |
| 37 | + chown mcpls:mcpls /etc/mcpls |
29 | 38 |
|
30 | | -# Set default environment variables |
31 | 39 | ENV MCPLS_CONFIG=/etc/mcpls/mcpls.toml |
32 | 40 | ENV MCPLS_LOG=info |
33 | 41 |
|
34 | | -# Run as non-root user for security |
35 | | -RUN useradd -m -u 1000 mcpls && \ |
36 | | - chown -R mcpls:mcpls /etc/mcpls |
37 | | - |
38 | 42 | USER mcpls |
39 | 43 | WORKDIR /home/mcpls |
40 | 44 |
|
41 | 45 | ENTRYPOINT ["mcpls"] |
42 | | -CMD [] |
|
0 commit comments