# Multi-stage Dockerfile to build Android Gradle project from source using Gradle 4.1 and Android SDK 25
# Stage 1: builder with Gradle and Android SDK
FROM gradle:jdk8 AS builder
# Install required system packages
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
wget \
unzip \
zip \
curl \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# Android SDK setup
ENV ANDROID_SDK_ROOT=/opt/android-sdk
ENV PATH="$PATH:$ANDROID_SDK_ROOT/cmdline-tools/tools/bin:$ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/tools/bin:$ANDROID_SDK_ROOT/platform-tools"
RUN mkdir -p "$ANDROID_SDK_ROOT" \
&& mkdir -p "$ANDROID_SDK_ROOT/cmdline-tools/tools" \
&& mkdir -p "$ANDROID_SDK_ROOT/platform-tools" \
&& rm -rf "$ANDROID_SDK_ROOT"/*
# Download and install Android SDK command-line tools
RUN wget -q https://dl.google.com/android/repository/commandlinetools-linux-8512546_latest.zip -O /tmp/commandlinetools.zip \
&& unzip -q /tmp/commandlinetools.zip -d "$ANDROID_SDK_ROOT/cmdline-tools" \
&& rm /tmp/commandlinetools.zip
# Install platform-tools and build-tools 25.0.1 and platform android-25
RUN yes | "$ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager" --sdk_root="$ANDROID_SDK_ROOT" \
"platform-tools" \
"platforms;android-25" \
"build-tools;25.0.1" \
> /dev/null
# Copy the source code into the container
WORKDIR /workspace
COPY . /workspace
# Ensure wrapper is executable
RUN chmod +x gradlew
# Build the project (multi-module)
RUN ./gradlew clean build -x test
# Stage 2: runtime image with built artifacts
FROM openjdk:8-jre-slim AS runtime
# Copy the built AARs and artifacts from the builder if present
COPY --from=builder /workspace/spacelib/build/outputs/aar /opt/spacelib-aar
COPY --from=builder /workspace/Sample/build/outputs/aar /opt/sample-aar
WORKDIR /opt
# Give an interactive shell by default for inspection
CMD ["bash"]
FROM gradle:jdk8
# Install required system packages
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
wget \
unzip \
zip \
curl \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# Android SDK setup
ENV ANDROID_SDK_ROOT=/opt/android-sdk
ENV ANDROID_SDK_HOME=/opt/android-sdk
RUN mkdir -p "$ANDROID_SDK_ROOT" \
&& mkdir -p "$ANDROID_SDK_ROOT/cmdline-tools" \
&& mkdir -p "$ANDROID_SDK_ROOT/platform-tools" \
&& rm -rf "$ANDROID_SDK_ROOT"/*
# Download and install Android SDK command-line tools
RUN wget -q https://dl.google.com/android/repository/commandlinetools-linux-8512546_latest.zip -O /tmp/commandlinetools.zip \
&& unzip -q /tmp/commandlinetools.zip -d "$ANDROID_SDK_ROOT/cmdline-tools" \
&& rm /tmp/commandlinetools.zip
# Install platform-tools and build-tools 25.0.1 and platform android-25
RUN yes | "$ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager" --sdk_root="$ANDROID_SDK_ROOT" \
"platform-tools" \
"platforms;android-25" \
"build-tools;25.0.1" \
> /dev/null
# Copy the source code into the container
WORKDIR /workspace
COPY . /workspace
# Ensure wrapper is executable
RUN chmod +x gradlew
# Build the project (multi-module)
RUN ./gradlew clean build -x test
# Stage 2: (no separate runtime stage; final image is built with Gradle and Android tools installed)
# Default to an interactive shell
CMD ["bash"]
node_modules/ build/ .gradle/ .gradle/ dist/ target/ *.iml .idea/ *.log .DS_Store **/build/ **/out/
- Failing step - [5/9] RUN yes | "/opt/android-sdk/cmdline-tools/tools/bin/sdkmanager" --sdk_root="/opt/android-sdk" "platform-tools" "platforms;android-25" "build-tools;25.0.1" > /dev/null - Exact error message and exit code - /bin/sh: 1: /opt/android-sdk/cmdline-tools/tools/bin/sdkmanager: not found - Exit code: 127 - Missing packages or files mentioned - The sdkmanager binary was not found at /opt/android-sdk/cmdline-tools/tools/bin/sdkmanager (missing the Android SDK command-line tools binary at the expected path) - Version/mismatch information - The build is attempting to install platform-tools, platforms;android-25, and build-tools;25.0.1 (Android API 25), using the command-line tools from the downloaded package. No explicit version mismatch error is shown, but the target components are older API levels.
FROM gradle:jdk8
# Install required system packages
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
wget \
unzip \
zip \
curl \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# Android SDK setup
ENV ANDROID_SDK_ROOT=/opt/android-sdk
ENV PATH="$PATH:$ANDROID_SDK_ROOT/cmdline-tools/tools/bin:$ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/tools/bin:$ANDROID_SDK_ROOT/platform-tools"
RUN mkdir -p "$ANDROID_SDK_ROOT" \
&& mkdir -p "$ANDROID_SDK_ROOT/cmdline-tools" \
&& mkdir -p "$ANDROID_SDK_ROOT/platform-tools" \
&& rm -rf "$ANDROID_SDK_ROOT"/*
# Download and install Android SDK command-line tools
RUN wget -q https://dl.google.com/android/repository/commandlinetools-linux-8512546_latest.zip -O /tmp/commandlinetools.zip \
&& unzip -q /tmp/commandlinetools.zip -d "$ANDROID_SDK_ROOT/cmdline-tools" \
&& rm /tmp/commandlinetools.zip
# Install platform-tools and build-tools 25.0.1 and platform android-25
RUN bash -lc 'if [ -x "$ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager" ]; then sdk="$ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager"; elif [ -x "$ANDROID_SDK_ROOT/cmdline-tools/bin/sdkmanager" ]; then sdk="$ANDROID_SDK_ROOT/cmdline-tools/bin/sdkmanager"; elif [ -x "$ANDROID_SDK_ROOT/tools/bin/sdkmanager" ]; then sdk="$ANDROID_SDK_ROOT/tools/bin/sdkmanager"; else echo "sdkmanager not found"; exit 1; fi; yes | "$sdk" --sdk_root="$ANDROID_SDK_ROOT" "platform-tools" "platforms;android-25" "build-tools;25.0.1"'
# Copy the source code into the container
WORKDIR /workspace
COPY . /workspace
# Ensure wrapper is executable
RUN chmod +x gradlew
# Build the project (multi-module)
RUN ./gradlew clean build -x test
# Default to an interactive shell
CMD ["bash"]
Summary of Docker build error
- Exact error message and exit code
- sdkmanager not found
- The step failed with exit code: 1
- Failing command/step
- Step: [5/9] RUN bash -lc 'if [ -x "$ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager" ]; then sdk="$ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager"; elif [ -x "$ANDROID_SDK_ROOT/cmdline-tools/bin/sdkmanager" ]; then sdk="$ANDROID_SDK_ROOT/cmdline-tools/bin/sdkmanager"; elif [ -x "$ANDROID_SDK_ROOT/tools/bin/sdkmanager" ]; then sdk="$ANDROID_SDK_ROOT/tools/bin/sdkmanager"; else echo "sdkmanager not found"; exit 1; fi; yes | "$sdk" --sdk_root="$ANDROID_SDK_ROOT" "platform-tools" "platforms;android-25" "build-tools;25.0.1"'
- Missing packages or files mentioned
- The script prints: sdkmanager not found
- None of the expected sdkmanager binaries exist at:
- $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager
- $ANDROID_SDK_ROOT/cmdline-tools/bin/sdkmanager
- $ANDROID_SDK_ROOT/tools/bin/sdkmanager
- Context shows: commandlinetools ZIP was downloaded/unzipped to /opt/android-sdk/cmdline-tools, but the sdkmanager binary is missing/not executable
- Version mismatch info
- No explicit version mismatch message in the log
- The command attempts to install: platform-tools, platforms;android-25, build-tools;25.0.1, which are older Android components; the failure occurs before these can be installed due to the missing sdkmanager.FROM gradle:jdk8
# Install required system packages
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
wget \
unzip \
zip \
curl \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# Android SDK setup
ENV ANDROID_SDK_ROOT=/opt/android-sdk
ENV PATH="$PATH:$ANDROID_SDK_ROOT/cmdline-tools/tools/bin:$ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/tools/bin:$ANDROID_SDK_ROOT/platform-tools"
RUN mkdir -p "$ANDROID_SDK_ROOT" \
&& mkdir -p "$ANDROID_SDK_ROOT/cmdline-tools" \
&& mkdir -p "$ANDROID_SDK_ROOT/platform-tools" \
&& rm -rf "$ANDROID_SDK_ROOT"/*
# Download and install Android SDK command-line tools
RUN wget -q https://dl.google.com/android/repository/commandlinetools-linux-8512546_latest.zip -O /tmp/commandlinetools.zip \
&& unzip -q /tmp/commandlinetools.zip -d "$ANDROID_SDK_ROOT/cmdline-tools" \
&& rm /tmp/commandlinetools.zip
# Install platform-tools and build-tools 25.0.1 and platform android-25
RUN bash -lc '
SDKMANAGER_PATH="";
if [ -x "$ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager" ]; then SDKMANAGER_PATH="$ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager";
elif [ -x "$ANDROID_SDK_ROOT/cmdline-tools/bin/sdkmanager" ]; then SDKMANAGER_PATH="$ANDROID_SDK_ROOT/cmdline-tools/bin/sdkmanager";
elif [ -x "$ANDROID_SDK_ROOT/tools/bin/sdkmanager" ]; then SDKMANAGER_PATH="$ANDROID_SDK_ROOT/tools/bin/sdkmanager";
else echo "sdkmanager not found"; exit 1; fi;
yes | "$SDKMANAGER_PATH" --sdk_root="$ANDROID_SDK_ROOT" "platform-tools" "platforms;android-25" "build-tools;25.0.1"'
# Copy the source code into the container
WORKDIR /workspace
COPY . /workspace
# Ensure wrapper is executable
RUN chmod +x gradlew
# Build the project (multi-module)
RUN ./gradlew clean build -x test
# Default to an interactive shell
CMD ["bash"]
#0 building with "default" instance using docker driver #1 [internal] load build definition from Dockerfile #1 transferring dockerfile: 1.92kB done #1 DONE 0.0s Dockerfile:30 -------------------- 28 | # Install platform-tools and build-tools 25.0.1 and platform android-25 29 | RUN bash -lc ' 30 | >>> SDKMANAGER_PATH=""; 31 | if [ -x "$ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager" ]; then SDKMANAGER_PATH="$ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager"; 32 | elif [ -x "$ANDROID_SDK_ROOT/cmdline-tools/bin/sdkmanager" ]; then SDKMANAGER_PATH="$ANDROID_SDK_ROOT/cmdline-tools/bin/sdkmanager"; -------------------- ERROR: failed to build: failed to solve: dockerfile parse error on line 30: unknown instruction: SDKMANAGER_PATH="";
FROM gradle:jdk8
# Install required system packages
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
wget \
unzip \
zip \
curl \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# Android SDK setup
ENV ANDROID_SDK_ROOT=/opt/android-sdk
ENV PATH="$PATH:$ANDROID_SDK_ROOT/cmdline-tools/tools/bin:$ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/tools/bin:$ANDROID_SDK_ROOT/platform-tools"
RUN mkdir -p "$ANDROID_SDK_ROOT" \
&& mkdir -p "$ANDROID_SDK_ROOT/cmdline-tools" \
&& mkdir -p "$ANDROID_SDK_ROOT/platform-tools" \
&& rm -rf "$ANDROID_SDK_ROOT"/*
# Download and install Android SDK command-line tools
RUN wget -q https://dl.google.com/android/repository/commandlinetools-linux-8512546_latest.zip -O /tmp/commandlinetools.zip \
&& unzip -q /tmp/commandlinetools.zip -d "$ANDROID_SDK_ROOT/cmdline-tools" \
&& rm /tmp/commandlinetools.zip
# Install platform-tools and build-tools 25.0.1 and platform android-25
RUN set -e; \
SDKMANAGER=""; \
if [ -x "$ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager" ]; then SDKMANAGER="$ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager"; \
elif [ -x "$ANDROID_SDK_ROOT/cmdline-tools/bin/sdkmanager" ]; then SDKMANAGER="$ANDROID_SDK_ROOT/cmdline-tools/bin/sdkmanager"; \
elif [ -x "$ANDROID_SDK_ROOT/tools/bin/sdkmanager" ]; then SDKMANAGER="$ANDROID_SDK_ROOT/tools/bin/sdkmanager"; \
else echo "sdkmanager not found"; exit 1; \
fi; \
yes | "$SDKMANAGER" --sdk_root="$ANDROID_SDK_ROOT" "platform-tools" "platforms;android-25" "build-tools;25.0.1"
# Copy the source code into the container
WORKDIR /workspace
COPY . /workspace
# Ensure wrapper is executable
RUN chmod +x gradlew
# Build the project (multi-module)
RUN ./gradlew clean build -x test
# Default to an interactive shell
CMD ["bash"]
Summary:
- Status: VerifyBuild: build_failed
- Primary cause: Missing sdkmanager binary
- Failing command/step (RUN):
RUN set -e; SDKMANAGER=""; if [ -x "/opt/android-sdk/cmdline-tools/tools/bin/sdkmanager" ]; then SDKMANAGER="/opt/android-sdk/cmdline-tools/tools/bin/sdkmanager"; elif [ -x "/opt/android-sdk/cmdline-tools/bin/sdkmanager" ]; then SDKMANAGER="/opt/android-sdk/cmdline-tools/bin/sdkmanager"; elif [ -x "/opt/android-sdk/tools/bin/sdkmanager" ]; then SDKMANAGER="/opt/android-sdk/tools/bin/sdkmanager"; else echo "sdkmanager not found"; exit 1; fi; yes | "$SDKMANAGER" --sdk_root="/opt/android-sdk" "platform-tools" "platforms;android-25" "build-tools;25.0.1"
- Exact error/exit: "sdkmanager not found"; Exit code: 1
- Missing packages/files:
- Searches for sdkmanager in:
- /opt/android-sdk/cmdline-tools/tools/bin/sdkmanager
- /opt/android-sdk/cmdline-tools/bin/sdkmanager
- /opt/android-sdk/tools/bin/sdkmanager
- None exist at runtime
- Version/mismatch info:
- Intended installs: platform-tools, platforms;android-25, build-tools;25.0.1
- Android commandline-tools ZIP downloaded: commandlinetools-linux-8512546_latest.zip
- Target components are old (Android 7.1 / API 25); failure is due to missing binary rather than version issues, though old tooling may be incompatible
- Concerns:
- Path variability: sdkmanager could be under cmdline-tools/cmdline-tools/tools/bin/sdkmanager depending on zip structure; if not found, build fails with “sdkmanager not found”gradle (624 stars): Gradle is a fast, reliable, and flexible open-source build tool with an elegant, circleci/android (85 stars): CircleCI images for Android cimg/android (43 stars): bitnami/gradle (14 stars): Bitnami Secure Image for gradle jetbrains/qodana-jvm-android (2 stars): Qodana for Android projects chainguard/gradle (0 stars): Build, ship and run secure software with Chainguard's low-to-zero CVE container journeyapps/android-node-test-base (0 stars): jetbrains/qodana-android (0 stars): Qodana for Android projects okteto/gradle (1 stars): rancher/vm-android (1 stars):
FROM circleci/android:api-25 # Set working directory and copy project WORKDIR /workspace COPY . /workspace # Ensure wrapper is executable RUN chmod +x gradlew # Build the project (multi-module) - skip tests for speed in image build RUN ./gradlew clean build -x test # Default to an interactive shell CMD ["bash"]
- Failing step/command: [4/5] RUN chmod +x gradlew (Dockerfile:8) - Exact error message and exit code: - chmod: changing permissions of 'gradlew': Operation not permitted - Exit code: 1 - The process "/bin/sh -c chmod +x gradlew" did not complete successfully: exit code: 1 - Missing packages or files mentioned: None reported. The issue is a file permission problem on gradlew, not a missing package/file. - Version mismatch info: Base image used is circleci/android:api-25; no version mismatch reported.