# Pre-baked cross-compiler for Linux arm64 Tauri releases (runs on Linux amd64). # Bakes in: amd64 cross-toolchain, arm64 multiarch dev libs, Node.js, and Rust. # This image takes ~15 min to build but is only rebuilt when deps change. # Rebuild when: Rust toolchain version, webkit2gtk/gtk major version, Node.js major version, # OpenSSL major version (used via OPENSSL_STATIC=1), or Tauri CLI changes that affect # bundler system deps. # Tag format: rust-node FROM ubuntu:22.04 ARG DEBIAN_FRONTEND=noninteractive # Step 1: amd64 host tools and cross-compiler RUN apt-get update -qq \ && apt-get install -y -qq --no-install-recommends \ ca-certificates curl git gcc g++ make patchelf pkg-config perl jq \ gcc-aarch64-linux-gnu g++-aarch64-linux-gnu \ && rm -rf /var/lib/apt/lists/* # Step 2: Enable arm64 multiarch. Ubuntu uses ports.ubuntu.com for arm64 to avoid # binary-all index conflicts with the amd64 archive.ubuntu.com mirror. RUN dpkg --add-architecture arm64 \ && sed -i 's|^deb http://archive.ubuntu.com|deb [arch=amd64] http://archive.ubuntu.com|g' /etc/apt/sources.list \ && sed -i 's|^deb http://security.ubuntu.com|deb [arch=amd64] http://security.ubuntu.com|g' /etc/apt/sources.list \ && printf '%s\n' \ 'deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports jammy main restricted universe multiverse' \ 'deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports jammy-updates main restricted universe multiverse' \ 'deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports jammy-security main restricted universe multiverse' \ > /etc/apt/sources.list.d/arm64-ports.list \ && apt-get update -qq \ && apt-get install -y -qq --no-install-recommends \ libwebkit2gtk-4.1-dev:arm64 \ libssl-dev:arm64 \ libgtk-3-dev:arm64 \ librsvg2-dev:arm64 \ && rm -rf /var/lib/apt/lists/* # Step 3: Node.js 22 RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \ && apt-get install -y --no-install-recommends nodejs \ && rm -rf /var/lib/apt/lists/* # Step 4: Rust 1.88 with arm64 cross-compilation target RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y \ --default-toolchain 1.88.0 --profile minimal --no-modify-path \ && /root/.cargo/bin/rustup target add aarch64-unknown-linux-gnu \ && (/root/.cargo/bin/rustup component add rustfmt clippy || true) ENV PATH="/root/.cargo/bin:${PATH}"