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

Docker化React Native应用后,如何在真机与模拟器运行?附报错求助

Docker化React Native应用:真机/模拟器无法打开应用的问题

我在Docker化React Native应用时遇到问题,能成功创建镜像,但不知道如何在真机及模拟器中打开应用。

我的配置信息

Dockerfile

FROM node:16
ARG NODE_ENV=production
ENV NODE_ENV $NODE_ENV
ARG PORT=19006
ENV PORT $PORT
EXPOSE $PORT 19001 19002
ENV NPM_CONFIG_PREFIX=/home/node/.npm-global
ENV PATH /home/node/.npm-global/bin:$PATH
RUN npm install -g expo-cli@latest
RUN yarn global add @expo/ngrok@4.1.0
RUN mkdir /opt/react_native_app
WORKDIR /opt/react_native_app
ENV PATH /opt/react_native_app/.bin:$PATH
COPY ./package.json ./package-lock.json ./
RUN npm install
WORKDIR /opt/react_native_app/app
COPY . .
CMD ["npx", "expo", "start", "--non-interactive"]

运行命令

docker run -p 19006:19006 -p 19001:19001 -p 19002:19002 mobile

终端输出

Starting project at /opt/react_native_app/app
Starting Metro Bundler
Waiting on http://localhost:8081
Logs for your project will appear below.

我的主机IP是192.168.0.15,请问如何在手机及模拟器中访问应用?


更新:新增报错问题

现在出现以下报错(截图:报错截图),但直接在本地执行npx expo start并选择'i'选项,iPhone模拟器能正常运行应用,Xcode也已更新,求该报错的解决方法。


解决方案

一、基础访问问题修复(真机/模拟器无法连接)

  1. 修正Metro绑定地址
    容器内的Metro默认绑定localhost,外部设备无法访问。修改启动命令,让Metro监听容器的所有IP,并启用LAN模式:

    • 方式1:修改Dockerfile的CMD指令
      CMD ["npx", "expo", "start", "--non-interactive", "--host", "0.0.0.0", "--lan"]
      
    • 方式2:运行容器时动态传递参数
      docker run -p 19006:19006 -p 19001:19001 -p 19002:19002 -p 8081:8081 mobile npx expo start --non-interactive --host 0.0.0.0 --lan
      
  2. 补充端口映射
    Metro默认使用8081端口,必须添加该端口的映射,否则设备无法连接打包服务。

  3. 模拟器访问步骤

    • iOS模拟器:在主机终端执行npx expo client:open --ios --url exp://192.168.0.15:19006,直接让模拟器连接容器内的Expo服务。
    • Android模拟器:同理,执行npx expo client:open --android --url exp://192.168.0.15:19006,确保模拟器与主机在同一网络。
  4. 真机访问步骤

    • 确保手机与主机在同一WiFi网络
    • 安装Expo Go应用
    • 在Expo Go中手动输入地址exp://192.168.0.15:19006,或扫描容器终端生成的二维码(若容器以交互式运行)

二、更新后的Xcode相关报错修复

Docker容器无法直接访问主机的iOS模拟器环境,需通过以下方式规避:

  1. 分离Metro与模拟器启动

    • 保持容器内的Metro服务正常运行(已绑定0.0.0.0并映射端口)
    • 在主机终端执行npx expo start --ios --no-metro,此命令会启动iOS模拟器,并让它连接到容器中运行的Metro服务。
  2. 使用主机网络模式(仅Mac/Windows)
    让容器直接使用主机的网络栈,无需端口映射,命令如下:

    docker run --network host mobile
    

    之后在主机上正常启动模拟器即可连接到容器内的服务。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 02:53:15