Docker部署Node.js/Fastify项目创建CSV文件遇EROFS错误求助
解决Docker部署Node.js/Fastify时创建CSV的EROFS只读错误
问题根源
Docker容器的默认文件系统大部分是只读的(尤其是官方Node镜像的基础层),你直接往容器内部的reports目录写入文件,触发了只读权限限制。
可行解决方案
1. 写入容器默认可写目录
容器内的/tmp目录是默认可写的,修改代码路径到该目录下:
const fs = require('fs'); // 先确保目标目录存在,recursive参数自动创建多级目录 fs.mkdirSync("/tmp/reports", { recursive: true }); // 创建文件写入流 const ws = fs.createWriteStream("/tmp/reports/test.csv");
2. 挂载宿主机目录作为卷(推荐用于持久化数据)
启动容器时,把宿主机的一个目录挂载到容器内的reports目录,这样容器内的该目录就具备读写权限:
docker run -v /宿主机本地绝对路径/reports:/app/reports your-fastify-image-name
说明:假设你的Fastify项目在容器内的工作目录是/app,代码里的reports/test.csv路径会对应到宿主机的/宿主机本地绝对路径/reports/test.csv,文件会持久化在宿主机上。
3. 在Dockerfile中创建可写目录并配置权限
如果不需要宿主机挂载,可在构建镜像时创建目录并设置正确权限:
WORKDIR /app # 创建reports目录并将权限赋予node用户(官方Node镜像默认的非root用户) RUN mkdir -p reports && chown -R node:node reports # 以node用户运行容器,避免权限冲突 USER node
这样容器启动后,/app/reports目录就是可写的,代码路径无需修改。
额外提醒
- 避免直接写入容器的系统目录(如
/root、/usr等),这些目录几乎都是只读的。 - 检查是否用了
--read-only参数启动容器,如果是,必须通过卷挂载来提供可写路径。
内容的提问来源于stack exchange,提问作者Dally
相关产品推荐
相关产品推荐

