From 57523ad7e4aaae3168a81b3e9d70de5cf31ff3d5 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 28 Jan 2026 22:57:00 +0000 Subject: [PATCH] Add Flutter dev container configuration for mobile development Adds a dedicated dev container under .devcontainer/mobile/ following the monorepo multi-container pattern. Includes a multi-stage Dockerfile with Android SDK (platform 36) and Flutter 3.29.2, a devcontainer.json with Dart/Flutter VS Code extensions, and an on-create script that configures Flutter for Android-only development and installs project dependencies. https://claude.ai/code/session_013F3TXesccdf2ta5qwykPtt --- .devcontainer/mobile/Dockerfile | 83 ++++++++++++++++++++++++++ .devcontainer/mobile/devcontainer.json | 32 ++++++++++ .devcontainer/mobile/on-create.sh | 19 ++++++ 3 files changed, 134 insertions(+) create mode 100644 .devcontainer/mobile/Dockerfile create mode 100644 .devcontainer/mobile/devcontainer.json create mode 100755 .devcontainer/mobile/on-create.sh diff --git a/.devcontainer/mobile/Dockerfile b/.devcontainer/mobile/Dockerfile new file mode 100644 index 000000000..59cd79ca6 --- /dev/null +++ b/.devcontainer/mobile/Dockerfile @@ -0,0 +1,83 @@ +# Multi-stage Dockerfile for Flutter Android development +# Inspired by: https://github.com/wtfzambo/flutter-devcontainer-template + +# --- Builder Stage --- +FROM --platform=linux/amd64 debian:bookworm-slim AS builder + +ARG DEBIAN_FRONTEND=noninteractive + +ENV ANDROID_SDK_ROOT=/android-sdk +ENV FLUTTER_SDK_ROOT=/flutter + +RUN apt-get update \ + && apt-get -y install --no-install-recommends \ + wget \ + unzip \ + xz-utils \ + openjdk-17-jdk \ + && apt-get autoremove -y \ + && apt-get clean -y \ + && rm -rf /var/lib/apt/lists/* + +# Download and install Android Command Line Tools +RUN mkdir -p ${ANDROID_SDK_ROOT}/cmdline-tools \ + && wget -O commandlinetools.zip "https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip" \ + && unzip commandlinetools.zip -d ${ANDROID_SDK_ROOT}/cmdline-tools \ + && mv ${ANDROID_SDK_ROOT}/cmdline-tools/cmdline-tools ${ANDROID_SDK_ROOT}/cmdline-tools/latest \ + && rm commandlinetools.zip + +# Accept Android SDK licenses and install necessary components +# compileSdk=36, minSdkVersion=24 per mobile/android/app/build.gradle +RUN yes | ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager --licenses && \ + ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager \ + "build-tools;34.0.0" \ + "platform-tools" \ + "platforms;android-36" + +# Download and install Flutter (>=3.27.0 per mobile/pubspec.yaml) +RUN mkdir -p ${FLUTTER_SDK_ROOT} \ + && wget -O flutter.tar.xz "https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_3.29.2-stable.tar.xz" \ + && tar xf flutter.tar.xz -C ${FLUTTER_SDK_ROOT} --strip-components=1 \ + && rm flutter.tar.xz + +# --- Final Stage --- +FROM --platform=linux/amd64 debian:bookworm-slim AS final + +ARG USERNAME=vscode +ARG USER_UID=1000 +ARG USER_GID=$USER_UID +ARG HOME=/home/${USERNAME} + +ENV ANDROID_SDK_ROOT=${HOME}/android-sdk +ENV FLUTTER_SDK_ROOT=${HOME}/flutter +ENV PATH=$PATH:${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin +ENV PATH=$PATH:${ANDROID_SDK_ROOT}/platform-tools +ENV PATH=$PATH:${FLUTTER_SDK_ROOT}/bin + +RUN dpkg --add-architecture amd64 \ + && apt-get update \ + && apt-get -y install --no-install-recommends \ + curl \ + git \ + unzip \ + xz-utils \ + zip \ + openjdk-17-jdk \ + libglu1-mesa \ + libc6:amd64 \ + sudo \ + && apt-get autoremove -y \ + && apt-get clean -y \ + && rm -rf /var/lib/apt/lists/* + +# Create a non-root user +RUN groupadd --gid ${USER_GID} ${USERNAME} \ + && useradd --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} \ + && echo ${USERNAME} ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/${USERNAME} \ + && chmod 0440 /etc/sudoers.d/${USERNAME} + +USER ${USERNAME} + +# Copy SDKs from the builder stage to the user's home directory +COPY --from=builder --chown=${USERNAME}:${USERNAME} /android-sdk ${ANDROID_SDK_ROOT} +COPY --from=builder --chown=${USERNAME}:${USERNAME} /flutter ${FLUTTER_SDK_ROOT} diff --git a/.devcontainer/mobile/devcontainer.json b/.devcontainer/mobile/devcontainer.json new file mode 100644 index 000000000..01f02deeb --- /dev/null +++ b/.devcontainer/mobile/devcontainer.json @@ -0,0 +1,32 @@ +{ + "name": "Sure Mobile (Flutter)", + "build": { + "dockerfile": "Dockerfile", + "args": { + "USERNAME": "${localEnv:USER}${localEnv:USERNAME}" + } + }, + "containerEnv": { + "SHELL": "/bin/bash" + }, + "runArgs": [ + "--platform", + "linux/amd64", + "--name", + "${localWorkspaceFolderBasename}_flutter_devcontainer" + ], + "onCreateCommand": "bash ./.devcontainer/mobile/on-create.sh", + "remoteUser": "${localEnv:USER}${localEnv:USERNAME}", + "customizations": { + "vscode": { + "extensions": [ + "Dart-Code.dart-code", + "Dart-Code.flutter" + ], + "settings": { + "terminal.integrated.defaultProfile.linux": "bash", + "dart.flutterSdkPath": "/home/${localEnv:USER}${localEnv:USERNAME}/flutter" + } + } + } +} diff --git a/.devcontainer/mobile/on-create.sh b/.devcontainer/mobile/on-create.sh new file mode 100755 index 000000000..4213601df --- /dev/null +++ b/.devcontainer/mobile/on-create.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -e + +# Disable analytics for CI/container environments +dart --disable-analytics +flutter --disable-analytics + +# Configure Flutter for Android-only development +flutter config --no-enable-web +flutter config --no-enable-linux-desktop +flutter config --no-enable-macos-desktop +flutter config --no-enable-windows-desktop + +# Verify the development environment +flutter doctor + +# Install project dependencies +cd mobile +flutter pub get