node.js - 如何将文件上传到dockerized Node.js容器(服务器)?

标签 node.js docker multer

我正在尝试将图像文件上传到服务器根目录下的文件夹(/public/temp_upload)。服务器由Node.js编写,上传文件由multer完成。它在本地工作正常,但是当服务器移动到 docker 容器时,它会抛出权限错误。

这是代码片段。错误发生在 put 端点。

const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, process.env.NODE_ENV === 'production' ? '/usr/src/app/public/temp_upload' : 'public/temp_upload');
    },
    filename: (req, file, cb) => {
        cb(null, Date.now() + '-' + file.originalname);
    },
});

const imageFilter = function(req, file, cb) {
    // accept image only
    if (!file.originalname.match(/\.(jpg|jpeg|png|gif)$/)) {
        return cb(new Error('Only image files are allowed!'), false);
    }
    cb(null, true);
};

const upload = multer({storage: storage, fileFilter: imageFilter});

module.exports = app => {
    app.post('/', async (req, res) => {
        const key = nanoid();
        console.log(req.body.type);
        const fileType = req.body.type.replace('image/', '');
        res.json({
            key,
            url:
                process.env.NODE_ENV === 'production'
                    ? `/usr/src/app/public/upload/${req.user.id}_${key}.${fileType}`
                    : `public/upload/${req.user.id}_${key}.${fileType}`,
        }).end();
    });

    app.put('/', upload.single('image'), async (req, res) => {
        res.status(200).json({tempPath: req.file.path});
    });
};

错误是

 image/jpeg
app_1    | [Error: EACCES: permission denied, open '/usr/src/app/public/temp_upload/1584467058084-3DkRrcPOfnF4pnEWRWyRu.jpg'] {
app_1    |   errno: -13,
app_1    |   code: 'EACCES',
app_1    |   syscall: 'open',
app_1    |   path: '/usr/src/app/public/temp_upload/1584467058084-3DkRrcPOfnF4pnEWRWyRu.jpg',
app_1    |   storageErrors: []
app_1    | }``

最佳答案

我只是用卷来解决问题。为了更好地理解卷,请阅读文档的这一部分。 https://docs.docker.com/storage/volumes/

这是 docker-compose.yml 的片段。

version: '3'
services:
    app:
        build:
            context: .
            args:
                - NODE_ENV=production
        command: bash -c "node setup.js && npx nodemon server.js"
        volumes:
            - ./public/temp_upload:/usr/src/app/public/temp_upload
            - ./public/upload:/usr/src/app/public/upload
        depends_on:
            - mysql
            - redis
        ports:
            - 3000:3000
...

关于node.js - 如何将文件上传到dockerized Node.js容器(服务器)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60732054/

相关文章:

Node.js/winston - 我可以追加日志吗?

docker - 使用用户命名空间共享 docker 套接字

javascript - multer 文件上传不适用于 Node 窗口

javascript - 将数据从 server/app.js 传递到 Controller Angular-fullstack + multer

docker - 在Docker中使用Data Volume Container作为单数据库 "backend"有什么好处?

javascript - 使用 multer 上传文件时 Node.js 连接重置

node.js - Gatsby - 无法解析 'path' 中的 'C:\Users\...\gatsby-starter-hello-world\node_modules\postcss\lib'

javascript - Sequelize连接错误

node.js - 使用运行 Nodejs 的 Azure Function 进行事件网格验证

linux - Docker 未绑定(bind) DNS 服务器 : How to launch as service