Dockerfile71 lines · 2962 chars FROM eclipse-temurin:17-jdk-jammy AS builder
LABEL maintainer="BuildAgent" \
description="Karing Android app build with Gradle and Flutter in a multi-stage Docker image"
ENV DEBIAN_FRONTEND=noninteractive
# Install required system utilities
RUN apt-get update && apt-get install -y --no-install-recommends \
curl \
unzip \
git \
ca-certificates \
build-essential \
python3 \
python3-pip \
software-properties-common \
libnss3 \
&& rm -rf /var/lib/apt/lists/*
# Android SDK installation (command-line tools)
ENV ANDROID_SDK_ROOT=/opt/android-sdk
ENV ANDROID_HOME=${ANDROID_SDK_ROOT}
ENV PATH="${PATH}:${ANDROID_SDK_ROOT}/platform-tools:${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin"
RUN mkdir -p "$ANDROID_SDK_ROOT" && \
mkdir -p "$ANDROID_SDK_ROOT/cmdline-tools" && \
curl -fsSL https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip -o /tmp/commandlinetools.zip && \
unzip -q /tmp/commandlinetools.zip -d "$ANDROID_SDK_ROOT/cmdline-tools" && \
rm /tmp/commandlinetools.zip && \
mv "$ANDROID_SDK_ROOT/cmdline-tools/cmdline-tools" "$ANDROID_SDK_ROOT/cmdline-tools/latest" && \
chmod -R a+rX "$ANDROID_SDK_ROOT" \
# Accept licenses and install required Android packages
RUN "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" --licenses || true
RUN "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager" \
"platform-tools" \
"platforms;android-35" \
"build-tools;36.0.0" \
"ndk;28.2.13676358"
# Flutter SDK setup
RUN git clone https://github.com/flutter/flutter.git /opt/flutter --depth 1
ENV FLUTTER_ROOT=/opt/flutter
ENV PATH="${PATH}:/opt/flutter/bin:$FLUTTER_ROOT/bin/cache/dart-sdk/bin"
RUN flutter --version || true
RUN flutter precache || true
# Copy source and build
WORKDIR /project
COPY . .
# Build the Android app (debug) to produce an APK
WORKDIR /project/android
RUN ./gradlew clean assembleDebug
# Copy produced APKs to a shared outputs directory
RUN mkdir -p /project/outputs && \
bash -lc 'if ls app/build/outputs/apk/debug/*.apk 1> /dev/null 2>&1; then cp app/build/outputs/apk/debug/*.apk /project/outputs/karing-app-debug.apk; fi'
RUN bash -lc 'if ls app/build/outputs/apk/release/*.apk 1> /dev/null 2>&1; then cp app/build/outputs/apk/release/*.apk /project/outputs/karing-app-release.apk; fi'
# Final runtime image that just exposes the built APK
FROM debian:bookworm-slim AS final
LABEL maintainer="BuildAgent" \
description="Container with built APK available at /outputs"
RUN apt-get update && apt-get install -y --no-install-recommends bash ca-certificates && rm -rf /var/lib/apt/lists/*
COPY --from=builder /project/outputs /outputs
CMD ["/bin/bash","-lc","if [ -f /outputs/karing-app-debug.apk ]; then echo 'Debug APK: /outputs/karing-app-debug.apk'; fi; if [ -f /outputs/karing-app-release.apk ]; then echo 'Release APK: /outputs/karing-app-release.apk'; fi; tail -f /dev/null"]