Docker化NestJS项目无法访问public目录静态文件求助
问题背景
在src目录旁创建public文件夹并放入pic.png,修改main.ts配置静态资源,尝试三种写法:
app.useStaticAssets(join(__dirname, '..', 'public'));app.useStaticAssets(join(__dirname, '/../public'));app.useStaticAssets(join(__dirname, '..', 'public'), { index: false, prefix: '/public/' });
项目通过192.168.1.102可访问,API接口http://192.168.1.102/api/test返回正常,但访问http://192.168.1.102/pic.png和http://192.168.1.102/public/pic.png均返回404。项目已设置全局前缀app.setGlobalPrefix('api');。
排查与解决步骤
1. 校验容器内静态文件路径
Docker容器中代码挂载路径为/usr/src/app,需确认public文件夹是否存在于该路径下:
docker exec -it <你的应用容器名> sh # 进入容器后执行 ls /usr/src/app/public
若找不到public文件夹,需检查本地目录结构(确保public与src同级)及docker-compose的volume映射是否正确。
2. 调整静态资源配置顺序
全局前缀不会影响静态资源路由,但需确保静态资源配置在全局前缀设置之前:
// 先配置静态资源 app.useStaticAssets(join(__dirname, '..', 'public'), { prefix: '/public/', }); // 再设置API全局前缀 app.setGlobalPrefix('api');
调整后访问路径应为http://192.168.1.102/public/pic.png。
3. 修正Dockerfile的COPY路径
Dockerfile位于src/modules/app/,构建上下文是项目根目录,需修正COPY指令路径:
# Development stage FROM node:alpine As development WORKDIR /usr/src/app COPY package*.json ./ RUN npm install -g pnpm RUN pnpm install --save # 直接从项目根目录拷贝文件 COPY . . RUN pnpm run build
同时在项目根目录添加.dockerignore文件,避免冗余文件拷贝:
node_modules dist .dockerignore .gitignore
4. 验证静态资源路径解析
在main.ts中添加日志,打印静态资源的实际映射路径:
console.log('静态资源路径:', join(__dirname, '..', 'public'));
启动容器后查看日志,确认路径最终解析为/usr/src/app/public(开发模式下会显示为/usr/src/app/src/../public,实际等价于目标路径)。
5. 检查框架版本兼容性
确保@nestjs/platform-express版本与@nestjs/core版本一致,避免中间件兼容性问题。
验证操作
调整配置后重启容器:
docker-compose down && docker-compose up --build
再次访问http://192.168.1.102/public/pic.png确认是否正常返回图片。
内容的提问来源于stack exchange,提问作者DolDurma

