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

