Skip to content

Commit 647cd7c

Browse files
committed
build: optimize Dockerfile with cargo-chef and debian slim base
1 parent e7c7cc9 commit 647cd7c

File tree

1 file changed

+40
-85
lines changed

1 file changed

+40
-85
lines changed

Dockerfile

Lines changed: 40 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,52 @@
1-
FROM rust:1.86.0@sha256:300ec56abce8cc9448ddea2172747d048ed902a3090e6b57babb2bf19f754081 AS builder
2-
3-
## Update the system generally
4-
RUN apt-get update && \
5-
apt-get upgrade -y && \
6-
rm -rf /var/lib/apt/lists/*
7-
8-
WORKDIR /root/app
9-
10-
## Build deps for git-mit
11-
RUN apt-get update && \
12-
apt-get install -y libxkbcommon-dev libxcb-shape0-dev libxcb-xfixes0-dev help2man && \
13-
rm -rf /var/lib/apt/lists/*
1+
# syntax=docker/dockerfile:1.4
2+
ARG RUST_VERSION=1.86.0
143

4+
FROM rust:${RUST_VERSION} AS planner
5+
WORKDIR /app
6+
RUN cargo install cargo-chef
157
COPY . .
8+
RUN cargo chef prepare --recipe-path recipe.json
169

17-
RUN --mount=type=cache,target=/root/.cargo cargo clean
18-
RUN --mount=type=cache,target=/root/.cargo cargo build --release
19-
RUN help2man target/release/mit-commit-msg > target/mit-commit-msg.1
20-
RUN help2man target/release/mit-pre-commit > target/mit-pre-commit.1
21-
RUN help2man target/release/mit-prepare-commit-msg > target/mit-prepare-commit-msg.1
22-
RUN help2man target/release/git-mit > target/git-mit.1
23-
RUN help2man target/release/git-mit-config > target/git-mit-config.1
24-
RUN help2man target/release/git-mit-relates-to > target/git-mit-relates-to.1
25-
RUN help2man target/release/git-mit-install > target/git-mit-install.1
26-
27-
FROM rust:1.86.0@sha256:300ec56abce8cc9448ddea2172747d048ed902a3090e6b57babb2bf19f754081
28-
ENV DEBIAN_FRONTEND=noninteractive
29-
30-
## Update the system generally
31-
RUN apt-get update && \
32-
apt-get upgrade -y && \
33-
rm -rf /var/lib/apt/lists/*
34-
35-
### Nice things for actually using the tool
36-
## Bash
37-
RUN apt-get update && \
38-
apt-get install -y bash bash-completion && \
39-
rm -rf /var/lib/apt/lists/*
40-
41-
## Git
42-
RUN apt-get update && \
43-
apt-get install -y git && \
44-
rm -rf /var/lib/apt/lists/*
10+
FROM rust:${RUST_VERSION} AS cacher
11+
WORKDIR /app
12+
RUN cargo install cargo-chef
13+
COPY --from=planner /app/recipe.json recipe.json
14+
RUN cargo chef cook --release --recipe-path recipe.json
4515

46-
## Vim
16+
FROM rust:${RUST_VERSION} AS builder
17+
WORKDIR /app
18+
COPY . .
19+
COPY --from=cacher /app/target target
20+
COPY --from=cacher /usr/local/cargo /usr/local/cargo
4721
RUN apt-get update && \
48-
apt-get install -y vim && \
22+
apt-get install -y help2man && \
4923
rm -rf /var/lib/apt/lists/*
24+
RUN --mount=type=cache,target=/app/target \
25+
--mount=type=cache,target=/usr/local/cargo/registry \
26+
cargo build --release && \
27+
for bin in mit-commit-msg mit-pre-commit mit-prepare-commit-msg git-mit git-mit-config git-mit-relates-to git-mit-install; do \
28+
help2man target/release/$bin > target/$bin.1; \
29+
done
5030

51-
## Man
52-
RUN apt-get update && \
53-
apt-get install -y man && \
54-
rm -rf /var/lib/apt/lists/*
31+
FROM debian:bookworm-slim
32+
ENV DEBIAN_FRONTEND=noninteractive
5533

56-
### The Tool
57-
## Runtime deps for git-mit
5834
RUN apt-get update && \
59-
apt-get install -y libxkbcommon0 libxcb-shape0 libxcb-xfixes0 libssl3 libgcc1 && \
60-
rm -rf /var/lib/apt/lists/*
61-
62-
COPY --from=builder \
63-
/root/app/target/release/mit-commit-msg \
64-
/usr/local/bin/mit-commit-msg
65-
COPY --from=builder \
66-
/root/app/target/release/mit-pre-commit \
67-
/usr/local/bin/mit-pre-commit
68-
COPY --from=builder \
69-
/root/app/target/release/mit-prepare-commit-msg \
70-
/usr/local/bin/mit-prepare-commit-msg
71-
COPY --from=builder \
72-
/root/app/target/release/git-mit \
73-
/usr/local/bin/git-mit
74-
COPY --from=builder \
75-
/root/app/target/release/git-mit-config \
76-
/usr/local/bin/git-mit-config
77-
COPY --from=builder \
78-
/root/app/target/release/git-mit-relates-to \
79-
/usr/local/bin/git-mit-relates-to
80-
COPY --from=builder \
81-
/root/app/target/release/git-mit-install \
82-
/usr/local/bin/git-mit-install
83-
COPY --from=builder \
84-
/root/app/target/*.1 \
85-
/usr/local/share/man/man1/
35+
apt-get install -y --no-install-recommends \
36+
libssl3 \
37+
ca-certificates \
38+
git \
39+
bash \
40+
bash-completion \
41+
man \
42+
&& rm -rf /var/lib/apt/lists/*
8643

87-
RUN mkdir -p $HOME/.local/share/bash-completion/completions
88-
RUN mit-commit-msg --completion bash > $HOME/.local/share/bash-completion/completions/mit-commit-msg
89-
RUN mit-pre-commit --completion bash > $HOME/.local/share/bash-completion/completions/mit-pre-commit
90-
RUN mit-prepare-commit-msg --completion bash > $HOME/.local/share/bash-completion/completions/mit-prepare-commit-msg
91-
RUN git-mit --completion bash > $HOME/.local/share/bash-completion/completions/git-mit
92-
RUN git-mit-config --completion bash > $HOME/.local/share/bash-completion/completions/git-mit-config
93-
RUN git-mit-relates-to --completion bash > $HOME/.local/share/bash-completion/completions/git-mit-relates-to
94-
RUN git-mit-install --completion bash > $HOME/.local/share/bash-completion/completions/git-mit-install
44+
COPY --from=builder /app/target/release/* /usr/local/bin/
45+
COPY --from=builder /app/target/*.1 /usr/local/share/man/man1/
9546

96-
RUN git-mit-install --scope=global
47+
RUN mkdir -p /usr/share/bash-completion/completions && \
48+
for bin in mit-commit-msg mit-pre-commit mit-prepare-commit-msg git-mit git-mit-config git-mit-relates-to git-mit-install; do \
49+
$bin --completion bash > /usr/share/bash-completion/completions/$bin; \
50+
done && \
51+
git-mit-install --scope=global
9752

0 commit comments

Comments
 (0)