node.js - 将文件从 Express.js 和 Multer 上传到持久 Docker Volume
问题描述
我正在使用 node.js 和 express.js 运行我的前端和后端。对于图像上传,我正在使用 Multer,我想将图像存储在我称之为媒体的 docker 卷中。
预期:从我的 node.js 应用程序上传一个图像,然后将其存储在 docker 卷中,然后可以通过键入 /media/image_name.jpg 在浏览器中访问它。
问题: 如果我在项目的根目录中创建一个名为 media 的文件夹,multer 会将图像直接上传到该文件夹,但是当我删除项目图像(不是卷)时,该文件夹不会持久。如果我不在 docker 容器中创建媒体文件夹,我只是得到文件或文件夹不存在。
我已成功创建卷,我可以在搬运工中看到它们已连接/安装为 /media。如果我尝试上传到媒体,它仍然不会上传到卷。
问题: 如何让 multer 将文件上传到名为 media 的 docker 卷,然后如何在浏览器中以 /media/image_name.jpg 的形式访问它。
这是我的码头工人撰写:
version: '3'
services:
nodejs:
build:
context: .
dockerfile: Dockerfile
image: nodejs
container_name: nodejs
ports:
- 8081:8081
volumes:
- media:/media
restart: unless-stopped
networks:
- app-network
webservertest:
image: nginx:stable-perl
container_name: webservertest
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- web-root:/var/www/html
- ./server/nginx-conf:/etc/nginx/conf.d
depends_on:
- nodejs
networks:
- app-network
db:
container_name: mongo
image: arm7/mongo
volumes:
- dbdata:/data/db
restart: unless-stopped
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
dbdata:
node_modules:
media:
web-root:
driver: local
driver_opts:
type: none
device: /
o: bind
这是我的multer配置:
const storage = multer.diskStorage({
destination: function(req, file, cb) {
cb(null, '/media');
},
filename: function(req, file, cb) {
cb(null, file.originalname + '-' + Date.now() + path.extname(file.origi$
}
});
我试图将 multer 路径重写为到 docker 卷的直接路由,但这也不起作用。
我希望有人能帮我解决这个问题,以便multer可以直接上传到docker卷并且文件将被持久化。
解决方案
我解决了!
我发现该卷已正确安装。发生这种情况是因为我在 Dockerfile 中使用“节点”作为用户,显然无论我是否授予权限,docker 容器都不允许该用户将文件写入文件夹。相反,我将用户更改为 root,现在它运行良好。
我还将 multer 文件路径更改为“./media/”。我将 docker-compose 中的卷声明更改为 - media:/home/node/app/media,因为这是我根据 Dockerfile 拥有项目的路径。
推荐阅读
- xamarin.ios - 使用 Appcues 脚本时,Xamarin HybridWebView 始终使用 xamarin.iOS 在浏览器中打开
- python-3.x - aws firehose lambda 函数调用给出错误的输出结构格式
- c# - 应用 Ninject 在我的 C# WPF 应用程序中使用“子视图模型”
- javascript - JSON中的所有值到JS中的字符串
- jquery - 问题对齐数据表中 DOM 上的按钮
- python - 列表中的字符串数据到python中的数值| 不可散列的类型:“列表”
- c++ - 向量中的模板推导失败
- xamarin - 由于 .net 问题,在 xam.plugin.downloadmanager 中安装失败
- javascript - 未捕获的 SyntaxError:意外的字符串错误
- apache-flink - Flink 键控状态清理用于增量 RocksDB 检查点