【问题标题】:Upload files from Express.js and Multer to persistent Docker Volume将文件从 Express.js 和 Multer 上传到持久 Docker Volume
【发布时间】:2021-10-21 01:47:09
【问题描述】:

我正在使用 node.js 和 express.js 运行我的前端和后端。对于图像上传,我使用 Multer,我想将图像存储在我称之为媒体的 docker 卷中。

预期: 从我的node.js 应用程序上传一张图片,然后将其存储在docker 卷中,然后可以在浏览器中通过键入/media/image_name.jpg 访问它。

问题: 如果我在项目的根目录中创建一个名为 media 的文件夹,multer 会将图像直接上传到该文件夹​​,但是当我删除项目图像(不是卷)时,该文件夹不会持久。如果我不在 docker 容器中创建媒体文件夹,我只是得到文件或文件夹不存在。

我已成功创建卷,我可以在搬运工中看到它们已连接/安装为 /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


    【解决方案1】:

    我解决了! ?

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      • 2015-06-09
      • 2018-04-24
      • 1970-01-01
      • 2020-09-04
      • 2016-10-18
      • 2018-08-01
      相关资源
      最近更新 更多