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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:12:38