You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker运行React Native Android项目在宿主机模拟器启动失败求助

React Native Android在Docker容器中卡在:app:installDebug步骤(宿主机模拟器可见但无法启动)

问题描述

使用Docker运行React Native Android项目时,项目构建流程正常完成,但无法在宿主机的Android模拟器中启动应用。在Docker容器内执行adb devices可以看到宿主机的模拟器设备,但容器终端一直卡在> Task :app:installDebug步骤,无法继续推进。

配置文件

docker-compose.yml

version: "4"
services:
  VNC-Service:
    image: baseImage
    build: .
    container_name: react-native
    network_mode: "host"
    environment: 
      VNC_PASSWORD: 123
      USE_POLLING: true
    privileged: true
    command:
      - bash
      - -c
      - |
        ../start_vnc.sh
    volumes:
      - ./:/app
    tty: true
    stdin_open: true

Dockerfile

FROM openjdk:17-jdk-slim

#=============================
# Install Dependenices 
#=============================
SHELL ["/bin/bash", "-c"]   

RUN apt update
RUN apt install -y curl 
RUN apt install -y sudo 
RUN apt install -y wget 
RUN apt install -y unzip 
RUN apt install -y bzip2 
RUN apt install -y libdrm-dev 
RUN apt install -y libxkbcommon-dev 
RUN apt install -y libgbm-dev 
RUN apt install -y libasound-dev 
RUN apt install -y libnss3 
RUN apt install -y libxcursor1 
RUN apt install -y libpulse-dev 
RUN apt install -y libxshmfence-dev 
RUN apt install -y xauth xvfb 
RUN apt install -y x11vnc 
RUN apt install -y fluxbox 
RUN apt install -y wmctrl 
RUN apt install -y libdbus-glib-1-2
RUN apt install -y usbutils
RUN apt install -y git
RUN apt install -y android-sdk-platform-tools

#==============================
# Android SDK ARGS
#==============================
ARG ARCH="x86_64" 
ARG TARGET="google_apis_playstore"  
ARG API_LEVEL="34" 
ARG BUILD_TOOLS="34.0.0"
ARG ANDROID_ARCH=${ANDROID_ARCH_DEFAULT}
ARG ANDROID_API_LEVEL="android-${API_LEVEL}"
ARG ANDROID_APIS="${TARGET};${ARCH}"
ARG EMULATOR_PACKAGE="system-images;${ANDROID_API_LEVEL};${ANDROID_APIS}"
ARG PLATFORM_VERSION="platforms;${ANDROID_API_LEVEL}"
ARG BUILD_TOOL="build-tools;${BUILD_TOOLS}"
ARG ANDROID_CMD="commandlinetools-linux-11076708_latest.zip"
ARG ANDROID_SDK_PACKAGES="${PLATFORM_VERSION} ${BUILD_TOOL} platform-tools"

#==============================
# Set JAVA_HOME - SDK
#==============================
ENV ANDROID_SDK_ROOT=/opt/android
ENV PATH "$PATH:$ANDROID_SDK_ROOT/cmdline-tools/tools:$ANDROID_SDK_ROOT/cmdline-tools/tools/bin:$ANDROID_SDK_ROOT/emulator:$ANDROID_SDK_ROOT/tools/bin:$ANDROID_SDK_ROOT/platform-tools:$ANDROID_SDK_ROOT/build-tools/${BUILD_TOOLS}"
ENV DOCKER="true"
ENV JAVA_HOME /usr/local/openjdk-17
ENV PATH ${PATH}:${ANDROID_HOME}/cmdline-tools/latest/bin:${ANDROID_HOME}/platform-tools

#============================================
# Install required Android CMD-line tools
#============================================
RUN wget https://dl.google.com/android/repository/${ANDROID_CMD} -P /tmp && \
              unzip -d $ANDROID_SDK_ROOT /tmp/$ANDROID_CMD && \
              mkdir -p $ANDROID_SDK_ROOT/cmdline-tools/tools && cd $ANDROID_SDK_ROOT/cmdline-tools &&  mv NOTICE.txt source.properties bin lib tools/  && \
              cd $ANDROID_SDK_ROOT/cmdline-tools/tools && ls

#============================================
# Install required package using SDK manager
#============================================
RUN yes Y | sdkmanager --licenses 
RUN yes Y | sdkmanager --verbose --no_https ${ANDROID_SDK_PACKAGES} 
RUN sdkmanager "ndk;25.1.8937393" "build-tools;33.0.1" "platforms;android-31" "cmake;3.22.1"

#====================================
# Install latest nodejs, npm & appium
#====================================
RUN curl -sL https://deb.nodesource.com/setup_20.x | bash && \
    apt-get -qqy install nodejs && \
    npm install -g npm && \
    npm i -g appium --unsafe-perm=true --allow-root && \
    appium driver install uiautomator2 && \
    exit 0 && \
    npm cache clean && \
    apt-get remove --purge -y npm &&  \
    apt-get autoremove --purge -y && \
    apt-get clean && \
    rm -Rf /tmp/* && rm -Rf /var/lib/apt/lists/*

#===================
# React Native Setup
#===================
RUN npm install -g react-native-cli

#===================
# Gradle Setup
#===================
ENV GRADLE_VERSION 8.3
ENV GRADLE_HOME /root/.gradle
ENV PATH ${PATH}:${GRADLE_HOME}/bin
ENV GRADLE_USER_HOME /root/.gradle

RUN wget -P /root/.gradle/wrapper/dists https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-all.zip && \
    unzip /root/.gradle/wrapper/dists/gradle-${GRADLE_VERSION}-all.zip -d /root/.gradle/wrapper/dists


ENV ADB_INSTALL_TIMEOUT=10

#===================
# Alias
#===================
ENV VNC=../start_vnc.sh
ENV HOME=/root
WORKDIR /app
#===================
# Ports
#===================
ENV ADB_SERVER_SOCKET=tcp:host.docker.internal:5037

#=========================
# Copying Scripts to root
#=========================
COPY start_vnc.sh /start_vnc.sh
RUN chmod a+x ../start_vnc.sh

#=======================
# framework entry point
#=======================
CMD ["npx", "react-native", "start"]

解决方案

  • 修复ADB服务器连接
    在容器内执行命令重启并重新连接adb服务:

    adb kill-server && adb connect host.docker.internal:5037
    

    同时在宿主机执行adb tcpip 5037,确保adb允许远程连接,并且宿主机防火墙未拦截5037端口。如果host.docker.internal无法解析,直接替换为宿主机的实际IP地址。

  • 延长安装超时时间
    修改Dockerfile中的ADB_INSTALL_TIMEOUT环境变量,将超时时间从10分钟延长至30分钟:

    ENV ADB_INSTALL_TIMEOUT=30
    
  • 检查模拟器配置
    确认宿主机模拟器已开启USB调试(在开发者选项中启用),同时模拟器的API级别与项目build.gradle中的compileSdkVersion、targetSdkVersion保持一致,避免版本不兼容导致安装停滞。

  • 修复Gradle权限问题
    容器内挂载的本地目录可能导致Gradle缓存权限异常,执行命令赋予缓存目录足够权限:

    chmod -R 777 /root/.gradle
    

    或者考虑在Dockerfile中创建非root用户,以该用户身份运行Gradle,避免权限冲突。

内容的提问来源于stack exchange,提问作者Martin Dempsey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:14:55