首页 > 解决方案 > 将文件从 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卷并且文件将被持久化。

标签: node.jsdockerdocker-composemulterdocker-volume

解决方案


我解决了!

我发现该卷已正确安装。发生这种情况是因为我在 Dockerfile 中使用“节点”作为用户,显然无论我是否授予权限,docker 容器都不允许该用户将文件写入文件夹。相反,我将用户更改为 root,现在它运行良好。

我还将 multer 文件路径更改为“./media/”。我将 docker-compose 中的卷声明更改为 - media:/home/node/app/media,因为这是我根据 Dockerfile 拥有项目的路径。


推荐阅读