diff --git a/Dockerfile b/Dockerfile index e597f4af59..5b87a4471b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,8 +28,7 @@ # fully endorsed by the ASF. ARG RUST_VERSION=1.96 - -FROM rust:${RUST_VERSION}-slim-bookworm AS builder +FROM rust:${RUST_VERSION}-slim-trixie AS builder WORKDIR /build RUN apt-get update && apt-get install -y \ @@ -46,7 +45,7 @@ RUN npm --prefix web ci && npm --prefix web run build:static RUN cargo build --bin iggy --release RUN cargo build --bin iggy-server --release -FROM debian:bookworm-slim +FROM debian:trixie-slim RUN apt-get update && apt-get install -y \ ca-certificates \ liblzma5 \ diff --git a/bdd/Dockerfile b/bdd/Dockerfile index efa8c63e54..8a9e3a07e0 100644 --- a/bdd/Dockerfile +++ b/bdd/Dockerfile @@ -27,7 +27,8 @@ # or stability of the code, it does indicate that the project has yet to be # fully endorsed by the ASF. -FROM rust:1.96.0-alpine3.22 AS builder +ARG RUST_VERSION=1.96 +FROM rust:${RUST_VERSION}-slim-trixie AS builder RUN apk add musl-dev WORKDIR /app @@ -36,7 +37,7 @@ COPY . . # Build server in debug mode for faster compilation RUN cargo build --bin iggy-server -FROM debian:bookworm-slim +FROM debian:trixie-slim # Install curl for healthcheck RUN apt-get update && \ diff --git a/bdd/java/Dockerfile b/bdd/java/Dockerfile index 4759275a01..9b35188ee7 100644 --- a/bdd/java/Dockerfile +++ b/bdd/java/Dockerfile @@ -27,9 +27,6 @@ # or stability of the code, it does indicate that the project has yet to be # fully endorsed by the ASF. -ARG RUST_VERSION=1.96 -FROM rust:${RUST_VERSION} - FROM gradle:9.6.0-jdk17 WORKDIR /workspace diff --git a/bdd/rust/Dockerfile b/bdd/rust/Dockerfile index 0249899d6e..ffe2daf720 100644 --- a/bdd/rust/Dockerfile +++ b/bdd/rust/Dockerfile @@ -28,7 +28,7 @@ # fully endorsed by the ASF. ARG RUST_VERSION=1.96 -FROM rust:${RUST_VERSION} +FROM rust:${RUST_VERSION}-slim-trixie WORKDIR /app diff --git a/core/server/Dockerfile b/core/server/Dockerfile index 2f95a43e51..c192830ac2 100644 --- a/core/server/Dockerfile +++ b/core/server/Dockerfile @@ -29,7 +29,6 @@ ARG RUST_VERSION=1.96 ARG ALPINE_VERSION=3.23 - # ── from-source path ───────────────────────────────────────────────────────── FROM --platform=$BUILDPLATFORM lukemathwalker/cargo-chef:latest-rust-${RUST_VERSION}-alpine${ALPINE_VERSION} AS chef WORKDIR /app diff --git a/foreign/php/Dockerfile.test b/foreign/php/Dockerfile.test index b6580ae7e9..6e70ef18be 100644 --- a/foreign/php/Dockerfile.test +++ b/foreign/php/Dockerfile.test @@ -15,7 +15,8 @@ # specific language governing permissions and limitations # under the License. -FROM rust:1.96-slim-bookworm +ARG RUST_VERSION=1.96 +FROM rust:${RUST_VERSION}-slim-trixie RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ diff --git a/foreign/python/.devcontainer/Dockerfile b/foreign/python/.devcontainer/Dockerfile index dccd315510..dd186cf933 100644 --- a/foreign/python/.devcontainer/Dockerfile +++ b/foreign/python/.devcontainer/Dockerfile @@ -27,7 +27,7 @@ # or stability of the code, it does indicate that the project has yet to be # fully endorsed by the ASF. -FROM mcr.microsoft.com/devcontainers/python:1-3.10-bullseye +FROM mcr.microsoft.com/devcontainers/python:1-3.10-trixie ENV VIRTUAL_ENV=/opt/venv RUN python -m venv $VIRTUAL_ENV diff --git a/foreign/python/Dockerfile.test b/foreign/python/Dockerfile.test index 8a3cb585c8..777b7e98ae 100644 --- a/foreign/python/Dockerfile.test +++ b/foreign/python/Dockerfile.test @@ -27,7 +27,7 @@ # or stability of the code, it does indicate that the project has yet to be # fully endorsed by the ASF. # Multi-stage build for Python SDK testing -FROM python:3.10-slim AS base +FROM python:3.10-slim-trixie AS base # Install system dependencies RUN apt-get update && apt-get install -y \ diff --git a/scripts/ci/sync-python-interpreter-version.sh b/scripts/ci/sync-python-interpreter-version.sh index 74e6e97e6d..1fdf680ae8 100755 --- a/scripts/ci/sync-python-interpreter-version.sh +++ b/scripts/ci/sync-python-interpreter-version.sh @@ -317,15 +317,15 @@ ensure_classifiers "$SOURCE_FILE" ensure_line \ "foreign/python/Dockerfile.test" \ - "^(FROM python:)[0-9]+\\.[0-9]+(-slim AS base)$" \ - "^FROM python:${PYTHON_VERSION_REGEX}-slim AS base$" \ + "^(FROM python:)[0-9]+\\.[0-9]+(-slim-trixie AS base)$" \ + "^FROM python:${PYTHON_VERSION_REGEX}-slim-trixie AS base$" \ "\\1${PYTHON_VERSION}\\2" \ "Docker image Python version" ensure_line \ "foreign/python/.devcontainer/Dockerfile" \ - "^(FROM mcr\\.microsoft\\.com/devcontainers/python:1-)[0-9]+\\.[0-9]+(-bullseye)$" \ - "^FROM mcr\\.microsoft\\.com/devcontainers/python:1-${PYTHON_VERSION_REGEX}-bullseye$" \ + "^(FROM mcr\\.microsoft\\.com/devcontainers/python:1-)[0-9]+\\.[0-9]+(-trixie)$" \ + "^FROM mcr\\.microsoft\\.com/devcontainers/python:1-${PYTHON_VERSION_REGEX}-trixie$" \ "\\1${PYTHON_VERSION}\\2" \ "devcontainer Python image version" diff --git a/scripts/ci/sync-rustc-version.sh b/scripts/ci/sync-rustc-version.sh index de4b65da79..386f10256e 100755 --- a/scripts/ci/sync-rustc-version.sh +++ b/scripts/ci/sync-rustc-version.sh @@ -78,6 +78,9 @@ fi # Strip trailing ".0" -> e.g., 1.89.0 -> 1.89 (no change if it doesn't end in .0) RUST_VERSION_SHORT=$(echo "$RUST_VERSION" | sed -E 's/^([0-9]+)\.([0-9]+)\.0$/\1.\2/') +RUST_IMAGE_VARIANT="slim-trixie" +RUST_IMAGE_PATTERN="FROM[[:space:]].*\\brust:" +RUST_IMAGE_TAG_PATTERN="(rust:[^-[:space:]]+)" echo "Rust version from rust-toolchain.toml: ${GREEN}$RUST_VERSION${NC} (using ${GREEN}$RUST_VERSION_SHORT${NC} for Dockerfiles)" echo "" @@ -91,6 +94,12 @@ TOTAL_FILES=0 FIXED_FILES=0 for dockerfile in $DOCKERFILES; do + SOURCE="" + CURRENT_VERSION="" + EXPECTED_VERSION="" + HAS_RUST_IMAGE="false" + RUST_IMAGE_MISMATCH="false" + # Two ways a Dockerfile pins the toolchain: # 1. `ARG RUST_VERSION=1.96` (+ `FROM rust:${RUST_VERSION}...`) # 2. hardcoded `FROM rust:1.96-slim` / `FROM rust:1.96.0-alpine` @@ -108,30 +117,67 @@ for dockerfile in $DOCKERFILES; do else EXPECTED_VERSION="$RUST_VERSION_SHORT" fi - else + fi + + if grep -qE "$RUST_IMAGE_PATTERN" "$dockerfile" 2>/dev/null; then + HAS_RUST_IMAGE="true" + if grep -E "$RUST_IMAGE_PATTERN" "$dockerfile" | grep -qvE -- "-$RUST_IMAGE_VARIANT([[:space:]]|$)"; then + RUST_IMAGE_MISMATCH="true" + fi + fi + + if [ -z "$SOURCE" ] && [ "$HAS_RUST_IMAGE" = "false" ]; then continue fi TOTAL_FILES=$((TOTAL_FILES + 1)) + STATUS_DETAILS="$CURRENT_VERSION" + if [ "$HAS_RUST_IMAGE" = "true" ]; then + STATUS_DETAILS="${STATUS_DETAILS:+$STATUS_DETAILS, }$RUST_IMAGE_VARIANT" + fi if [ "$MODE" = "check" ]; then - if [ "$CURRENT_VERSION" != "$EXPECTED_VERSION" ]; then + if { [ -n "$SOURCE" ] && [ "$CURRENT_VERSION" != "$EXPECTED_VERSION" ]; } || [ "$RUST_IMAGE_MISMATCH" = "true" ]; then MISALIGNED_FILES+=("$dockerfile") - echo -e "${RED}✗${NC} $dockerfile: ${RED}$CURRENT_VERSION${NC} (expected: ${GREEN}$EXPECTED_VERSION${NC})" + MESSAGE="" + if [ -n "$SOURCE" ] && [ "$CURRENT_VERSION" != "$EXPECTED_VERSION" ]; then + MESSAGE="Rust version ${RED}$CURRENT_VERSION${NC} (expected: ${GREEN}$EXPECTED_VERSION${NC})" + fi + if [ "$RUST_IMAGE_MISMATCH" = "true" ]; then + if [ -n "$MESSAGE" ]; then + MESSAGE="$MESSAGE; " + fi + MESSAGE="${MESSAGE}Rust base image must use ${GREEN}$RUST_IMAGE_VARIANT${NC}" + fi + echo -e "${RED}✗${NC} $dockerfile: $MESSAGE" else - echo -e "${GREEN}✓${NC} $dockerfile: $CURRENT_VERSION" + echo -e "${GREEN}✓${NC} $dockerfile${STATUS_DETAILS:+: $STATUS_DETAILS}" fi elif [ "$MODE" = "fix" ]; then - if [ "$CURRENT_VERSION" != "$EXPECTED_VERSION" ]; then - if [ "$SOURCE" = "arg" ]; then + if { [ -n "$SOURCE" ] && [ "$CURRENT_VERSION" != "$EXPECTED_VERSION" ]; } || [ "$RUST_IMAGE_MISMATCH" = "true" ]; then + if [ -n "$SOURCE" ] && [ "$CURRENT_VERSION" != "$EXPECTED_VERSION" ] && [ "$SOURCE" = "arg" ]; then sed -i "s/^ARG RUST_VERSION=.*/ARG RUST_VERSION=$EXPECTED_VERSION/" "$dockerfile" - else - sed -i -E "s/(\brust:)[0-9]+\.[0-9]+(\.[0-9]+)?/\1$EXPECTED_VERSION/g" "$dockerfile" + elif [ -n "$SOURCE" ] && [ "$CURRENT_VERSION" != "$EXPECTED_VERSION" ]; then + sed -i -E "/FROM[[:space:]].*\\brust:[0-9]/ s#(\\brust:)[0-9]+\\.[0-9]+(\\.[0-9]+)?#\\1$EXPECTED_VERSION#g" "$dockerfile" + fi + if [ "$RUST_IMAGE_MISMATCH" = "true" ]; then + sed -i -E "/$RUST_IMAGE_PATTERN/ s#$RUST_IMAGE_TAG_PATTERN-[^[:space:]]+#\\1-$RUST_IMAGE_VARIANT#g" "$dockerfile" + sed -i -E "/$RUST_IMAGE_PATTERN/ { /-$RUST_IMAGE_VARIANT([[:space:]]|$)/! s#$RUST_IMAGE_TAG_PATTERN([[:space:]]|$)#\\1-$RUST_IMAGE_VARIANT\\2#g; }" "$dockerfile" fi FIXED_FILES=$((FIXED_FILES + 1)) - echo -e "${GREEN}Fixed${NC} $dockerfile: ${RED}$CURRENT_VERSION${NC} -> ${GREEN}$EXPECTED_VERSION${NC}" + MESSAGE="" + if [ -n "$SOURCE" ] && [ "$CURRENT_VERSION" != "$EXPECTED_VERSION" ]; then + MESSAGE="Rust version ${RED}$CURRENT_VERSION${NC} -> ${GREEN}$EXPECTED_VERSION${NC}" + fi + if [ "$RUST_IMAGE_MISMATCH" = "true" ]; then + if [ -n "$MESSAGE" ]; then + MESSAGE="$MESSAGE; " + fi + MESSAGE="${MESSAGE}Rust base image -> ${GREEN}$RUST_IMAGE_VARIANT${NC}" + fi + echo -e "${GREEN}Fixed${NC} $dockerfile: $MESSAGE" else - echo -e "${GREEN}✓${NC} $dockerfile: already correct ($CURRENT_VERSION)" + echo -e "${GREEN}✓${NC} $dockerfile${STATUS_DETAILS:+: already correct ($STATUS_DETAILS)}" fi fi done