FROM svrnty/base-distro:flutter-sdk-latest AS base ARG FLUTTER_VERSION=3.38.9 LABEL org.opencontainers.image.title="flutter-sdk-linux" LABEL org.opencontainers.image.description="Flutter SDK for Linux desktop CI builds" LABEL org.opencontainers.image.version="${FLUTTER_VERSION}" # --- Install Linux desktop build deps in debian --- FROM debian:bookworm-slim AS deps-stage RUN apt-get update && apt-get install -y --no-install-recommends \ clang \ cmake \ ninja-build \ pkg-config \ libgtk-3-dev \ liblzma-dev \ libstdc++-12-dev \ && rm -rf /var/lib/apt/lists/* # --- Build final image --- FROM base USER 0 # Download Flutter SDK and strip unnecessary files in a single layer RUN curl -fsSL "https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${FLUTTER_VERSION}-stable.tar.xz" \ -o /tmp/flutter.tar.xz && \ tar xf /tmp/flutter.tar.xz -C /opt && \ rm /tmp/flutter.tar.xz && \ rm -rf /opt/flutter/dev \ /opt/flutter/examples \ /opt/flutter/bin/cache/artifacts/engine/android-* \ /opt/flutter/bin/cache/flutter_web_sdk RUN git config --global --add safe.directory /opt/flutter && \ cd /opt/flutter && git gc --prune=all # Remove symlinks that conflict with COPY from debian stage RUN rm -f /usr/lib/terminfo # Copy only specific toolchain binaries (not all of /usr/bin which would overwrite Wolfi's core utils) COPY --from=deps-stage /usr/bin/cmake /usr/bin/cmake COPY --from=deps-stage /usr/bin/ninja /usr/bin/ninja COPY --from=deps-stage /usr/bin/pkg-config /usr/bin/pkg-config COPY --from=deps-stage /usr/bin/clang-14 /usr/bin/clang-14 RUN ln -sf clang-14 /usr/bin/clang && ln -sf clang-14 /usr/bin/clang++ # Copy libraries from debian stage (specific subdirectories to avoid overwriting Wolfi's core libs) COPY --from=deps-stage /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu COPY --from=deps-stage /usr/lib/llvm-14 /usr/lib/llvm-14 COPY --from=deps-stage /usr/lib/cmake /usr/lib/cmake COPY --from=deps-stage /usr/lib/gcc /usr/lib/gcc COPY --from=deps-stage /usr/include /usr/include COPY --from=deps-stage /usr/share/cmake-3.25 /usr/share/cmake-3.25 COPY --from=deps-stage /usr/share/pkgconfig /usr/share/pkgconfig COPY --from=deps-stage /lib/x86_64-linux-gnu /lib/x86_64-linux-gnu # Remove Debian's glibc/ld files that conflict with Wolfi's newer glibc, # then register the Debian library paths and rebuild the linker cache RUN rm -f /usr/lib/x86_64-linux-gnu/libc.so* /usr/lib/x86_64-linux-gnu/libm.so* \ /usr/lib/x86_64-linux-gnu/libpthread* /usr/lib/x86_64-linux-gnu/libdl.so* \ /usr/lib/x86_64-linux-gnu/librt.so* /usr/lib/x86_64-linux-gnu/libresolv* \ /usr/lib/x86_64-linux-gnu/libmvec* /usr/lib/x86_64-linux-gnu/libnss_* \ /usr/lib/x86_64-linux-gnu/ld-linux* /usr/lib/x86_64-linux-gnu/crt*.o \ /usr/lib/x86_64-linux-gnu/libpcre2-8.so* \ /lib/x86_64-linux-gnu/libc.so* /lib/x86_64-linux-gnu/libc-* \ /lib/x86_64-linux-gnu/libm.so* /lib/x86_64-linux-gnu/libm-* \ /lib/x86_64-linux-gnu/libpthread* /lib/x86_64-linux-gnu/libdl.so* \ /lib/x86_64-linux-gnu/librt.so* /lib/x86_64-linux-gnu/libresolv* \ /lib/x86_64-linux-gnu/libmvec* /lib/x86_64-linux-gnu/libnss_* \ /lib/x86_64-linux-gnu/ld-linux* \ /lib/x86_64-linux-gnu/libpcre2-8.so* && \ echo "/usr/lib/x86_64-linux-gnu" > /etc/ld.so.conf.d/debian-x86_64.conf && \ echo "/lib/x86_64-linux-gnu" >> /etc/ld.so.conf.d/debian-x86_64.conf && \ ldconfig # Fix ownership before switching to flutter user RUN chown -R 65532:65532 /opt/flutter USER 65532 # Configure Flutter for Linux desktop only RUN flutter config --enable-linux-desktop \ --no-enable-web \ --no-enable-android \ --no-enable-ios \ --no-enable-macos-desktop \ --no-enable-windows-desktop # Precache only Linux artifacts RUN flutter precache --linux \ --no-web \ --no-android \ --no-ios \ --no-macos \ --no-windows \ --no-fuchsia \ --no-universal RUN flutter doctor -v WORKDIR /app