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
相关产品推荐
相关产品推荐

