Docker容器运行Angular应用访问页面出现'Cannot GET /'错误
问题根因
Cannot GET / 报错和你修改的angular.json里的aot配置没有任何关系,本质是容器内启动的Web服务没有正确托管Angular编译生成的静态资源,找不到根路径对应的index.html文件。
从你贴的配置看,核心问题有两个:
- 执行完
npm run build后,Angular编译产物默认会输出到dist/[你的项目名]目录,但你最终启动的server.js既没有在构建流程中做对应路径配置,也没有正确指向dist目录的静态资源,自然无法响应根路径请求。 - 如果你本意是在容器里跑Angular开发调试服务,那你既不需要提前执行build,也不需要启动node服务跑server.js。
修复方案
根据你的使用场景二选一即可:
方案一:本地调试用,直接跑开发服务
修改Dockerfile,移除build和server.js相关逻辑,直接启动Angular内置dev server:
WORKDIR /usr/src/app COPY package*.json ./ RUN npm install -g @angular/cli@14 RUN npm install COPY . ./ EXPOSE 4200 CMD ["npm", "start"]
注意你的start脚本已经配置了--host 0.0.0.0允许外部访问,启动容器后映射4200端口访问即可,不要用原来写的8080端口。
方案二:生产部署用,Nginx托管静态产物
生产环境不要用ng serve,也没必要自己写server.js做静态服务,直接用Nginx托管编译后的静态文件性能更好,用多阶段构建还能大幅缩小镜像体积,Dockerfile参考如下:
# 第一阶段:编译Angular项目 FROM node:18-alpine AS builder WORKDIR /usr/src/app COPY package*.json ./ RUN npm install -g @angular/cli@14 RUN npm install COPY . ./ RUN npm run build --prod # 第二阶段:启动Nginx服务 FROM nginx:alpine # 注意把下面路径里的your-project-name替换成你angular.json里配置的项目名,也就是ng build后dist目录下生成的文件夹名 COPY --from=builder /usr/src/app/dist/your-project-name/ /usr/share/nginx/html/ EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
替换完实际项目名后构建镜像,启动容器时映射80端口即可正常访问。
如果你一定要用自定义的
server.js托管服务,必须确认两个前提:一是server.js文件确实存放在项目根目录会被复制进镜像,二是server.js里配置的静态资源根路径正确指向npm run build生成的dist产物目录,否则服务找不到index.html就会持续报这个错。
内容的提问来源于stack exchange,提问作者Gustavo Liu
相关产品推荐
相关产品推荐

