我正在使用node.js 和express.js 运行我的前端和后端。对于图像上传,我使用 Multer,我想将图像存储在我称为媒体的 docker 卷中。
期望:从我的node.js应用程序上传图像,然后它将存储在docker卷中,然后可以通过输入/media/image_name.jpg在浏览器中访问它。
问题: 如果我在项目的根目录中创建一个名为 media 的文件夹,multer 会将图像直接上传到该文件夹,但当我删除项目图像(不是卷)时,该文件夹不会持久。如果我不在 docker 容器中创建媒体文件夹,我只会得到文件或文件夹不存在。
我已成功创建该卷,我可以在 portainer 中看到它们已连接/安装为 /media。如果我尝试上传到媒体,它仍然不会上传到卷。
问题: 我如何让 multer 将文件上传到名为 media 的 docker 卷,然后如何在浏览器中以 /media/image_name.jpg 的形式访问它。
这是我的 docker-compose:
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 中使用“node”作为用户,显然无论我是否授予权限,docker 容器都不允许该用户将文件写入该文件夹。相反,我将用户更改为 root,现在它工作正常。
我还将 multer 文件路径更改为“./media/”。我将 docker-compose 中的卷声明更改为 - media:/home/node/app/media,因为这是我根据 Dockerfile 拥有项目的路径。
非常感谢您只用了一小行就提供了这些信息 用户根