Docker环境下React Native/Expo的Metro Bundler无法正常启动
解决Docker中Expo项目仅返回JSON、无法显示Metro Bundler网页的问题
核心问题定位
你访问的localhost:9000是错误端口——Expo的Metro Bundler网页默认监听19002端口,而19000端口是Expo的API服务端口,访问它自然只会返回项目配置的JSON数据。
分步修复方案
1. 修正访问地址
直接访问 http://localhost:19002,应该就能看到Metro Bundler的网页界面。
2. 优化Docker配置(避免后续问题)
修改Dockerfile
简化配置并提升稳定性:
FROM node:18-alpine # 推荐用指定版本而非latest,避免兼容性问题 RUN mkdir -p /usr/src/app WORKDIR /usr/src/app COPY package*.json ./ RUN npm install -g expo-cli@latest RUN npm install EXPOSE 19000 19001 19002 CMD ["npm", "start", "--", "--host", "0.0.0.0"]
- 用
node:18-alpine镜像更小更稳定; - 提前安装项目依赖,避免容器启动时重复执行安装操作;
- 启动命令添加
--host 0.0.0.0,强制Expo绑定到容器内所有网络接口,确保宿主机能正常访问。
更新docker-compose.yml
替换<<my_local_ip_address>>为你宿主机的真实本地IP(比如192.168.1.100):
version: '3.7' services: expo: container_name: expo-app build: ./ ports: - 19000:19000 - 19001:19001 - 19002:19002 volumes: - ./:/usr/src/app - /usr/src/app/node_modules environment: - EXPO_DEVTOOLS_LISTEN_ADDRESS=0.0.0.0 - REACT_NATIVE_PACKAGER_HOSTNAME=192.168.1.100 # 替换为你的宿主机IP - EXPO_HOSTNAME=0.0.0.0
REACT_NATIVE_PACKAGER_HOSTNAME用于让移动端设备能连接到Metro服务;- 添加
EXPO_HOSTNAME=0.0.0.0确保Expo服务在容器内全局可访问。
3. 重启容器生效
执行以下命令重新构建并启动容器:
docker-compose down docker-compose build --no-cache docker-compose up -d
额外注意事项
- 确保宿主机防火墙没有屏蔽19000/19001/19002端口;
- 如果移动端要连接,需要保证设备和宿主机在同一局域网内,并且使用宿主机IP访问(比如
exp://192.168.1.100:19000)。
内容的提问来源于stack exchange,提问作者BigJobbies
相关产品推荐
相关产品推荐

