FROM --platform=linux/amd64 debian:bookworm-slim # ============================================================ # Layer 1: System dependencies (cached unless packages change) # ============================================================ RUN apt-get update && apt-get install -y --no-install-recommends \ curl git unzip xz-utils zip python3 python3-venv wget \ libgtk-3-dev ninja-build libglu1-mesa \ && rm -rf /var/lib/apt/lists/* \ && apt-get clean # ============================================================ # Layer 2: Non-root user (cached) # ============================================================ ARG USERNAME=vscode ARG USER_UID=1000 ARG USER_GID=1000 RUN groupadd --gid $USER_GID $USERNAME \ && useradd --uid $USER_UID --gid $USER_GID -m -s /bin/bash $USERNAME # ============================================================ # Layer 3: Flutter SDK (tarball — ~150MB vs 500MB+ git clone) # Uses pre-built release tarball instead of cloning the repo. # This alone saves 10-15 minutes on first build. # ============================================================ ENV FLUTTER_VERSION=3.41.8 ENV FLUTTER_HOME=/opt/flutter ENV PATH="$FLUTTER_HOME/bin:$PATH" # Download pre-built Flutter SDK tarball (much faster than git clone) RUN curl -fsSL "https://storage.googleapis.com/download.flutter.io/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 \ && flutter precache --android --ios \ && chown -R $USER_UID:$USER_GID $FLUTTER_HOME # ============================================================ # Layer 4: Android SDK (only what's needed for Flutter builds) # Parallel downloads where possible, minimal packages. # ============================================================ ENV ANDROID_HOME=/opt/android-sdk ENV PATH="$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools" RUN curl -fsSL "https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip" \ -o /tmp/cmdline-tools.zip \ && mkdir -p $ANDROID_HOME/cmdline-tools \ && unzip -q /tmp/cmdline-tools.zip -d $ANDROID_HOME/cmdline-tools \ && mv $ANDROID_HOME/cmdline-tools/cmdline-tools $ANDROID_HOME/cmdline-tools/latest \ && rm /tmp/cmdline-tools.zip \ # Accept licenses + install ONLY the packages Flutter needs && yes | sdkmanager --licenses \ && sdkmanager \ "platform-tools" \ "platforms;android-36" \ "build-tools;36.0.0" \ && rm -rf "$ANDROID_HOME/.android" \ && chown -R $USER_UID:$USER_GID $ANDROID_HOME # ============================================================ # Layer 5: Java (only needed for Android builds) # Use JRE instead of JDK — smaller footprint. # ============================================================ RUN apt-get update && apt-get install -y --no-install-recommends \ openjdk-17-jre-headless \ && rm -rf /var/lib/apt/lists/* \ && apt-get clean USER $USERNAME ENV HOME=/home/$USERNAME