Create React App在Docker构建时提示找不到./option-assertions模块如何解决
问题根因
- 你的Dockerfile中将
COPY package.json .和RUN npm install两个依赖安装步骤注释,直接复制全量项目文件到容器内,会把本地Windows环境生成的node_modules也带入镜像。Windows和Linux系统的npm二进制依赖不兼容,直接导致依赖文件缺失、无法正常加载。 - 即便取消注释,没有配置
.dockerignore排除本地node_modules的情况下,后续的COPY . .操作也会覆盖容器内安装的依赖,触发版本冲突。 - 部分alpine版node镜像缺少C++编译依赖,部分npm包安装时需要编译,也会导致依赖安装不完整。
解决方案
- 首先在项目根目录新增
.dockerignore文件,写入以下内容,排除无关文件避免被复制到容器内:
node_modules npm-debug.log build .git .gitignore .env
- 修改Dockerfile配置,调整构建步骤,优先使用和本地完全一致的node版本保证兼容性,修改后参考:
# 和本地node版本完全匹配,避免版本差异问题 FROM node:14.15.0 WORKDIR /client # 优先复制package相关文件,可利用docker缓存加快后续构建速度 COPY package.json package-lock.json* ./ # 用npm ci替代npm install,保证依赖版本和本地锁定的版本完全一致 RUN npm ci # 再复制剩余的项目代码 COPY . . # 执行构建 RUN npm run build CMD ["npm", "start"]
- 如果要继续使用alpine镜像,需要提前安装编译所需的系统依赖,修改后参考:
FROM node:14.15.0-alpine WORKDIR /client # 安装alpine下npm包编译需要的依赖 RUN apk add --no-cache python3 make g++ COPY package.json package-lock.json* ./ RUN npm ci COPY . . RUN npm run build CMD ["npm", "start"]
验证操作
执行docker system prune -f清理旧的构建缓存后,重新执行镜像构建命令即可正常构建。
内容的提问来源于stack exchange,提问作者Victor Ofoegbu
相关产品推荐
相关产品推荐

