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

Docker容器构建Expo应用时EAI_AGAIN错误求助

解决Docker容器化Expo应用时的EAI_AGAIN DNS超时问题

问题分析

你遇到的EAI_AGAIN错误本质是容器内部无法解析registry.npmjs.org的DNS,导致npm无法拉取expo包。结合Hyper-V环境,问题主要集中在Docker网络配置、Dockerfile逻辑错误两方面。

修复步骤

1. 修正Dockerfile逻辑错误

原Dockerfile在构建阶段直接执行RUN npx expo start,既未挂载项目目录,也未安装依赖,且RUN是构建阶段命令,不应用来启动应用。修改后的Dockerfile如下:

FROM node:14.13.1-buster-slim

# 使用host.docker.internal让容器能访问宿主机,替代127.0.0.1
ENV REACT_NATIVE_PACKAGER_HOSTNAME=host.docker.internal

ARG PORT=19006
ENV PORT=${PORT}

# 切换到node用户,避免权限冲突
USER node
ENV NPM_CONFIG_PREFIX=/home/node/.npm-global
ENV PATH /home/node/.npm-global/bin:$PATH

WORKDIR /app

# 先复制package文件,利用Docker缓存加速构建
COPY --chown=node:node package*.json ./
RUN npm install

# 复制项目代码
COPY --chown=node:node . .

# 用CMD在容器启动时执行启动命令,而非构建阶段的RUN
CMD ["npx", "expo", "start", "--port", "${PORT}"]

2. 修复docker-compose配置错误并添加DNS设置

原docker-compose存在语法错误,同时添加公共DNS服务器解决Hyper-V下的DNS解析问题:

version: '3.8'
services:
  react-native:
    build: 
      context: .
      args:
        NODE_ENV: development
    environment:
      NODE_ENV: development
      REACT_NATIVE_PACKAGER_HOSTNAME: host.docker.internal
    tty: true
    working_dir: /app 
    volumes:
      - ./ghi/app:/app
    ports: 
      - "19006:19006"
    # 添加公共DNS,强制容器使用可靠的解析服务
    dns:
      - 8.8.8.8
      - 1.1.1.1

3. 配置Docker全局DNS(可选但推荐)

打开Docker Desktop的Settings -> Docker Engine,添加DNS配置后重启Docker:

{
  "dns": ["8.8.8.8", "1.1.1.1"],
  "registry-mirrors": []
}

4. 验证容器DNS解析

执行以下命令测试容器是否能正常解析npm仓库:

docker run --rm alpine nslookup registry.npmjs.org

如果能返回IP地址,说明DNS问题已解决。

额外说明

  • 不要在构建阶段执行npx expo start:RUN是镜像构建时执行的命令,应用启动应该用CMD或ENTRYPOINT,在容器运行时执行。
  • host.docker.internal是Docker Desktop提供的特殊域名,可直接指向宿主机IP,解决容器与宿主机的通信问题。
  • 切换到node用户能避免后续挂载项目目录时的权限冲突,更符合容器最佳实践。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:57:10