将文件从 Express.js 和 Multer 上传到持久 Docker Volume

问题描述 投票:0回答:2

我正在使用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卷并且文件将被持久化。

node.js docker docker-compose multer docker-volume
2个回答
0
投票

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

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


-1
投票

非常感谢您只用了一小行就提供了这些信息 用户根

© www.soinside.com 2019 - 2024. All rights reserved.