# syntax=docker/dockerfile:1
FROM python:3.11-bookworm AS builder
RUN apt-get update \
&& apt-get install -y --no-install-recommends git build-essential \
&& rm -rf /var/lib/apt/lists/*
RUN pip install --no-cache-dir uv
WORKDIR /app
COPY pyproject.toml ./
COPY sherlog_mcp ./sherlog_mcp
RUN uv pip install --system .
FROM python:3.11-slim-bookworm AS runtime
RUN apt-get update \
&& ARCH=$(dpkg --print-architecture) \
&& PACKAGES="git ca-certificates curl wget unzip nodejs npm gh openjdk-17-jdk-headless android-sdk-platform-tools libc6-dev libstdc++6 zlib1g-dev miller" \
&& if [ "$ARCH" = "amd64" ]; then \
PACKAGES="$PACKAGES lib32z1 lib32ncurses6 lib32stdc++6"; \
echo "Adding 32-bit compatibility libraries for x86_64"; \
else \
echo "Skipping 32-bit compatibility libraries for $ARCH"; \
fi \
&& apt-get install -y --no-install-recommends $PACKAGES \
&& rm -rf /var/lib/apt/lists/*
ENV ANDROID_HOME=/opt/android-sdk
ENV ANDROID_SDK_ROOT=/opt/android-sdk
RUN JAVA_HOME_DETECTED=$(dirname $(dirname $(readlink -f $(which javac)))) \
&& echo "Detected JAVA_HOME: ${JAVA_HOME_DETECTED}" \
&& echo "export JAVA_HOME=${JAVA_HOME_DETECTED}" >> /etc/profile.d/java.sh \
&& chmod +x /etc/profile.d/java.sh
ENV PATH=${PATH}:${ANDROID_HOME}/cmdline-tools/latest/bin:${ANDROID_HOME}/platform-tools:${ANDROID_HOME}/build-tools/34.0.0
RUN mkdir -p ${ANDROID_HOME} \
&& cd ${ANDROID_HOME} \
&& ARCH=$(uname -m) \
&& if [ "$ARCH" = "aarch64" ] || [ "$ARCH" = "arm64" ]; then \
echo "ARM64 architecture detected, using Linux command line tools (compatible)"; \
wget -q https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip; \
else \
echo "x86_64 architecture detected, using Linux command line tools"; \
wget -q https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip; \
fi \
&& unzip commandlinetools-linux-9477386_latest.zip \
&& rm commandlinetools-linux-9477386_latest.zip \
&& mkdir -p cmdline-tools/latest \
&& mv cmdline-tools/* cmdline-tools/latest/ 2>/dev/null || true \
&& rmdir cmdline-tools/cmdline-tools 2>/dev/null || true \
&& chmod +x ${ANDROID_HOME}/cmdline-tools/latest/bin/*
RUN export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac)))) \
&& mkdir -p /root/.android \
&& touch /root/.android/repositories.cfg \
&& echo "Accepting Android SDK licenses..." \
&& yes | ${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager --licenses || true \
&& echo "Updating SDK manager..." \
&& ${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager --update \
&& echo "Installing SDK components..." \
&& ${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager \
"platform-tools" \
"build-tools;34.0.0" \
"build-tools;33.0.2" \
"build-tools;30.0.3" \
"platforms;android-34" \
"platforms;android-33" \
"platforms;android-30" \
"cmake;3.22.1" \
"ndk;25.1.8937393" \
&& echo "Android SDK installation complete"
RUN cd /tmp \
&& echo "Downloading Google Workspace CLI (gwcli)..." \
&& wget -q "https://github.com/GetSherlog/google-workspace-cli/releases/download/v1.0.0/gwcli-linux-amd64" \
&& echo "addaf11913b1c647f6d8e7cca734235d3bbc44c149c69cbc34850f010cc20cea gwcli-linux-amd64" | sha256sum -c - \
&& chmod +x gwcli-linux-amd64 \
&& mv gwcli-linux-amd64 /usr/local/bin/gwcli \
&& echo "Google Workspace CLI installed successfully"
RUN cd /tmp \
&& echo "Attempting to download BrowserStack CLI..." \
&& (wget -q "https://browserstack.com/browserstack-cli/download?arch=amd64&file=browserstack&os=linux&version=3.0.1&_gl=1*160c59b*_gcl_aw*R0NMLjE3NTIwMDEwNTQuQ2p3S0NBandnN1BEQmhCeEVpd0FmMUNWdTMzR2ZBWEk2M2t3c1VxcE9QNzUtMTZlUGdWd2IyOG9iczlNR1d1X1FWY0FyVVlVNm5sblF4b0NZSDRRQXZEX0J3RQ..*_gcl_au*MTkwMTY5OTI2NS4xNzUxODMzMzgwLjEyOTgzMDExNTguMTc1MVEzMzQ0Ni4xNzUxODMzNDU0" -O browserstack \
&& chmod +x browserstack \
&& mv browserstack /usr/local/bin/browserstack \
&& echo "BrowserStack CLI installed successfully") \
|| echo "BrowserStack CLI installation failed (not critical, continuing...)"
COPY --from=builder /usr/local /usr/local
# Install ast-grep CLI tool
RUN pip install ast-grep-cli
WORKDIR /app
COPY sherlog_mcp ./sherlog_mcp
RUN mkdir -p /app/data/sessions /app/data/oauth_tokens /workspace
# Enable Android tools inside this image
ENV SHERLOG_ENABLE_ANDROID_TOOLS=1
RUN echo '#!/bin/bash\n\
# Source Java environment if available\n\
if [ -f /etc/profile.d/java.sh ]; then\n\
source /etc/profile.d/java.sh\n\
fi\n\
# If JAVA_HOME is still not set, detect it dynamically\n\
if [ -z "$JAVA_HOME" ]; then\n\
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))\n\
fi\n\
echo "Starting Sherlog MCP Server with Android SDK Support"\n\
echo "======================================================"\n\
echo "System Architecture: $(uname -m)"\n\
echo "Android SDK: ${ANDROID_HOME}"\n\
echo "Java Version: $(java -version 2>&1 | head -1)"\n\
echo "ADB Version: $(adb --version 2>/dev/null || echo "ADB not available")"\n\
echo "Available Android platforms:"\n\
ls -la ${ANDROID_HOME}/platforms/ 2>/dev/null || echo "No platforms found"\n\
echo "Available build tools:"\n\
ls -la ${ANDROID_HOME}/build-tools/ 2>/dev/null || echo "No build tools found"\n\
echo "AAPT2 Test: $(${ANDROID_HOME}/build-tools/34.0.0/aapt2 version 2>/dev/null || echo "AAPT2 not working")"\n\
echo "BrowserStack CLI: $(browserstack version 2>/dev/null || echo "Not available or not authenticated")"\n\
echo "Google Workspace CLI: $(gwcli --version 2>/dev/null || echo "Not available")"\n\
echo "ast-grep: $(ast-grep --version 2>/dev/null || echo "Not available")"\n\
echo "Miller: $(mlr --version 2>/dev/null || echo "Not available")"\n\
echo "Environment variables:"\n\
echo " ANDROID_HOME=${ANDROID_HOME}"\n\
echo " ANDROID_SDK_ROOT=${ANDROID_SDK_ROOT}"\n\
echo " JAVA_HOME=${JAVA_HOME}"\n\
echo " PATH includes: $(echo $PATH | tr ":" "\n" | grep -E "(android|java)" | head -5)"\n\
echo "======================================================"\n\
echo "Starting MCP server on port 8000"\n\
exec uv run -m sherlog_mcp.main "$@"' > /app/start_sherlog.sh
RUN chmod +x /app/start_sherlog.sh
EXPOSE 8000
ENTRYPOINT ["/app/start_sherlog.sh"]