1+ # syntax=docker/dockerfile:1.7
12FROM ubuntu:24.04
23
34ARG TARGETOS
@@ -9,7 +10,9 @@ ENV DEBIAN_FRONTEND=noninteractive
910
1011# ## BASE ###
1112
12- RUN apt-get update \
13+ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
14+ --mount=type=cache,target=/var/lib/apt,sharing=locked \
15+ apt-get update \
1316 && apt-get install -y --no-install-recommends \
1417 binutils=2.42-* \
1518 sudo=1.9.* \
@@ -78,7 +81,9 @@ RUN apt-get update \
7881
7982# ## MISE ###
8083
81- RUN install -dm 0755 /etc/apt/keyrings \
84+ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
85+ --mount=type=cache,target=/var/lib/apt,sharing=locked \
86+ install -dm 0755 /etc/apt/keyrings \
8287 && curl -fsSL https://mise.jdx.dev/gpg-key.pub | gpg --batch --yes --dearmor -o /etc/apt/keyrings/mise-archive-keyring.gpg \
8388 && chmod 0644 /etc/apt/keyrings/mise-archive-keyring.gpg \
8489 && echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.gpg] https://mise.jdx.dev/deb stable main" > /etc/apt/sources.list.d/mise.list \
@@ -94,7 +99,9 @@ ENV PATH=$HOME/.local/share/mise/shims:$PATH
9499
95100# ## LLVM ###
96101
97- RUN apt-get update && apt-get install -y --no-install-recommends \
102+ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
103+ --mount=type=cache,target=/var/lib/apt,sharing=locked \
104+ apt-get update && apt-get install -y --no-install-recommends \
98105 cmake=3.28.* \
99106 ccache=4.9.* \
100107 ninja-build=1.11.* \
@@ -127,15 +134,18 @@ RUN git -c advice.detachedHead=0 clone --branch "$PYENV_VERSION" --depth 1 https
127134# Install pipx for common global package managers (e.g. poetry)
128135ENV PIPX_BIN_DIR=/root/.local/bin
129136ENV PATH=$PIPX_BIN_DIR:$PATH
130- RUN apt-get update \
137+ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
138+ --mount=type=cache,target=/var/lib/apt,sharing=locked \
139+ --mount=type=cache,target=/root/.cache/pip \
140+ --mount=type=cache,target=/root/.cache/pipx \
141+ apt-get update \
131142 && apt-get install -y --no-install-recommends pipx=1.4.* \
132143 && rm -rf /var/lib/apt/lists/* \
133- && pipx install --pip-args="--no-cache-dir --no-compile" poetry==2.1.* uv==0.7.* \
144+ && pipx install --pip-args="--no-cache-dir --no-compile --root-user-action=ignore " poetry==2.1.* uv==0.7.* \
134145 && for pyv in "${PYENV_ROOT}/versions/" *; do \
135- "$pyv/bin/python" -m pip install --no-cache-dir --no-compile --upgrade pip && \
136- "$pyv/bin/pip" install --no-cache-dir --no-compile ruff black mypy pyright isort pytest; \
137- done \
138- && rm -rf /root/.cache/pip ~/.cache/pip ~/.cache/pipx
146+ "$pyv/bin/python" -m pip install --no-cache-dir --no-compile --root-user-action=ignore --upgrade pip && \
147+ "$pyv/bin/pip" install --no-cache-dir --no-compile --root-user-action=ignore ruff black mypy pyright isort pytest; \
148+ done
139149
140150# Reduce the verbosity of uv - impacts performance of stdout buffering
141151ENV UV_NO_PROGRESS=1
@@ -153,7 +163,10 @@ ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0
153163ENV COREPACK_ENABLE_AUTO_PIN=0
154164ENV COREPACK_ENABLE_STRICT=0
155165
156- RUN git -c advice.detachedHead=0 clone --branch "$NVM_VERSION" --depth 1 https://github.com/nvm-sh/nvm.git "$NVM_DIR" \
166+ RUN --mount=type=cache,target=/root/.npm \
167+ --mount=type=cache,target=/root/.cache/yarn \
168+ --mount=type=cache,target=/root/.local/share/pnpm/store \
169+ git -c advice.detachedHead=0 clone --branch "$NVM_VERSION" --depth 1 https://github.com/nvm-sh/nvm.git "$NVM_DIR" \
157170 && echo 'source $NVM_DIR/nvm.sh' >> /etc/profile \
158171 && echo "prettier\n eslint\n typescript" > $NVM_DIR/default-packages \
159172 && . $NVM_DIR/nvm.sh \
@@ -171,9 +184,9 @@ RUN git -c advice.detachedHead=0 clone --branch "$NVM_VERSION" --depth 1 https:/
171184# ## BUN ###
172185
173186ARG BUN_VERSION=1.2.14
174- RUN mise use --global "bun@${BUN_VERSION}" \
175- && mise cache clear || true \
176- && rm -rf "$HOME/. cache/mise" "$HOME/.local/share/mise/downloads"
187+ RUN --mount=type=cache,target=/root/.cache/mise \
188+ mise use --global "bun@${BUN_VERSION}" \
189+ && mise cache clear || true
177190
178191# ## JAVA ###
179192
@@ -184,33 +197,35 @@ ARG MAVEN_VERSION=3.9.10
184197ARG AMD_JAVA_VERSIONS="25 24 23 22 21 17 11"
185198ARG ARM_JAVA_VERSIONS="25 24 23 22 21 17"
186199
187- RUN JAVA_VERSIONS="$( [ " $TARGETARCH" = " arm64" ] && echo " $ARM_JAVA_VERSIONS" || echo " $AMD_JAVA_VERSIONS" )" \
200+ RUN --mount=type=cache,target=/root/.cache/mise \
201+ JAVA_VERSIONS="$( [ " $TARGETARCH" = " arm64" ] && echo " $ARM_JAVA_VERSIONS" || echo " $AMD_JAVA_VERSIONS" )" \
188202 && for v in $JAVA_VERSIONS; do mise install "java@${v}" ; done \
189203 && mise use --global "java@${JAVA_VERSIONS%% *}" \
190204 && mise use --global "gradle@${GRADLE_VERSION}" \
191205 && mise use --global "maven@${MAVEN_VERSION}" \
192- && mise cache clear || true \
193- && rm -rf "$HOME/.cache/mise" "$HOME/.local/share/mise/downloads"
206+ && mise cache clear || true
194207
195208# ## SWIFT ###
196209
197210ARG SWIFT_VERSIONS="6.2 6.1 5.10.1"
198211# mise currently broken for swift on ARM
199- RUN if [ "$TARGETARCH" = "amd64" ]; then \
212+ RUN --mount=type=cache,target=/root/.cache/mise \
213+ if [ "$TARGETARCH" = "amd64" ]; then \
200214 for v in $SWIFT_VERSIONS; do \
201215 mise install "swift@${v}" ; \
202216 done && \
203217 mise use --global "swift@${SWIFT_VERSIONS%% *}" \
204- && mise cache clear || true \
205- && rm -rf "$HOME/.cache/mise" "$HOME/.local/share/mise/downloads" ; \
218+ && mise cache clear || true; \
206219 else \
207220 echo "Skipping Swift install on $TARGETARCH" ; \
208221 fi
209222
210223# ## RUST ###
211224
212225ARG RUST_VERSIONS="1.92.0 1.91.1 1.90 1.89.0 1.88.0 1.87.0 1.86.0 1.85.1 1.84.1 1.83.0"
213- RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain none \
226+ RUN --mount=type=cache,target=/root/.cargo/registry \
227+ --mount=type=cache,target=/root/.cargo/git \
228+ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain none \
214229 && . "$HOME/.cargo/env" \
215230 && echo 'source $HOME/.cargo/env' >> /etc/profile \
216231 && rustup toolchain install $RUST_VERSIONS --profile minimal --component rustfmt --component clippy \
@@ -219,7 +234,9 @@ RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --pr
219234# ## RUBY ###
220235
221236ARG RUBY_VERSIONS="3.2.3 3.3.8 3.4.4"
222- RUN apt-get update && apt-get install -y --no-install-recommends \
237+ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
238+ --mount=type=cache,target=/var/lib/apt,sharing=locked \
239+ apt-get update && apt-get install -y --no-install-recommends \
223240 libyaml-dev=0.2.* \
224241 libgmp-dev=2:6.3.* \
225242 && rm -rf /var/lib/apt/lists/* \
@@ -230,8 +247,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
230247
231248# ## C++ ###
232249# gcc is already installed via apt-get above, so these are just additional linters, etc.
233- RUN pipx install --pip-args="--no-cache-dir --no-compile" cpplint==2.0.* clang-tidy==20.1.* clang-format==20.1.* cmakelang==0.6.* \
234- && rm -rf /root/.cache/pip ~/.cache/pip ~/.cache/pipx
250+ RUN --mount=type=cache,target=/root/.cache/pip \
251+ --mount=type=cache,target=/root/.cache/pipx \
252+ pipx install --pip-args="--no-cache-dir --no-compile --root-user-action=ignore" cpplint==2.0.* clang-tidy==20.1.* clang-format==20.1.* cmakelang==0.6.*
235253
236254# ## BAZEL ###
237255
@@ -248,18 +266,21 @@ ARG GOLANG_CI_LINT_VERSION=2.1.6
248266
249267# Go defaults GOROOT to /usr/local/go - we just need to update PATH
250268ENV PATH=/usr/local/go/bin:$HOME/go/bin:$PATH
251- RUN for v in $GO_VERSIONS; do mise install "go@${v}" ; done \
269+ RUN --mount=type=cache,target=/root/.cache/mise \
270+ for v in $GO_VERSIONS; do mise install "go@${v}" ; done \
252271 && mise use --global "go@${GO_VERSIONS%% *}" \
253272 && mise use --global "golangci-lint@${GOLANG_CI_LINT_VERSION}" \
254- && mise cache clear || true \
255- && rm -rf "$HOME/.cache/mise" "$HOME/.local/share/mise/downloads"
273+ && mise cache clear || true
256274
257275# ## PHP ###
258276
259277ARG PHP_VERSIONS="8.5 8.4 8.3 8.2"
260278ENV MISE_JOBS=4 MAKEFLAGS="-j4" CC="ccache gcc" CXX="ccache g++"
261279
262- RUN apt-get update && apt-get install -y --no-install-recommends \
280+ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
281+ --mount=type=cache,target=/var/lib/apt,sharing=locked \
282+ --mount=type=cache,target=/root/.cache/mise \
283+ apt-get update && apt-get install -y --no-install-recommends \
263284 build-essential pkg-config ccache \
264285 autoconf=2.71-* bison=2:3.8.* re2c=3.1-* \
265286 libgd-dev=2.3.* libedit-dev=3.1-* libicu-dev=74.2-* libjpeg-dev=8c-* \
@@ -268,17 +289,16 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
268289 && rm -rf /var/lib/apt/lists/* \
269290 && mise install $(for v in $PHP_VERSIONS; do printf "php@%s " "$v" ; done) \
270291 && mise use --global "php@${PHP_VERSIONS%% *}" \
271- && mise cache clear || true \
272- && rm -rf "$HOME/.cache/mise" "$HOME/.local/share/mise/downloads"
292+ && mise cache clear || true
273293
274294# ## ELIXIR ###
275295
276296ARG ERLANG_VERSION=27.1.2
277297ARG ELIXIR_VERSION=1.18.3
278- RUN mise install "erlang@${ERLANG_VERSION}" "elixir@${ELIXIR_VERSION}-otp-27" \
298+ RUN --mount=type=cache,target=/root/.cache/mise \
299+ mise install "erlang@${ERLANG_VERSION}" "elixir@${ELIXIR_VERSION}-otp-27" \
279300 && mise use --global "erlang@${ERLANG_VERSION}" "elixir@${ELIXIR_VERSION}-otp-27" \
280- && mise cache clear || true \
281- && rm -rf "$HOME/.cache/mise" "$HOME/.local/share/mise/downloads"
301+ && mise cache clear || true
282302
283303# ## SETUP SCRIPTS ###
284304
0 commit comments