【问题标题】:docker node js file storage volumedocker node js文件存储卷
【发布时间】:2021-05-21 09:04:40
【问题描述】:

我制作了一个下载图像并将其保存到名为storage 的目录的应用程序。在开发中一切正常,但在容器中我得到了错误:

{"errno":-2,"code":"ENOENT","syscall":"open","path":"/usr/src/app/src/storage/samsung-Galaxy-Note20-Ultra -thumbnail.jpg","level":"error","service":"user-service","timestamp":"2021-05-20T20:27:42.545Z","message":"ENOENT: 没有这样的文件或目录,打开'/usr/src/app/src/storage/samsung-Galaxy-Note20-Ultra-thumbnail.jpg'","stack":"错误:ENOENT:没有这样的文件或目录,打开'/usr /src/app/src/storage/samsung-Galaxy-Note20-Ultra-thumbnail.jpg'"}

这是我的下载代码:

    for (const [i, product] of products.entries()) {
      const { thumbnail, name } = product;
      const ext = thumbnail.slice(thumbnail.lastIndexOf("."));
      const filePath = `${path.resolve("./src/storage")}/${
        brand.text
      }-${slugify(name)}-thumbnail${ext}`;

      try {
        await download({
          url: thumbnail,
          path: filePath,
        });
        products[i].thumbnail = filePath.slice(filePath.indexOf("src"));

        logger.info(`"${name}" thumbnail saved to ${filePath}`);
      } catch (error) {
        logger.error(error);
      }
    }

此代码使用path node js 模块,这是下载功能:

const { createWriteStream } = require("fs");
const { pipeline } = require("stream");
const { promisify } = require("util");
const fetch = require("node-fetch");

const download = async ({ url, path }) => {
  const streamPipeline = promisify(pipeline);
  const response = await fetch(url);

  if (!response.ok) {
    throw new Error(`unexpected response ${response.statusText}`);
  }

  await streamPipeline(response.body, createWriteStream(path));
};

这是我的文件夹结构:

还有我在 docker-comspoe.yml 中的 docker 卷:

   volumes:
      - ./storage:/src/storage

和我的 dockerfile 中的工作目录:

WORKDIR /usr/src/app

我不知道是什么导致了这个错误。

【问题讨论】:

  • 这是 Windows/MacOS 吗?
  • Linux VPS上MacOS生产开发

标签: javascript node.js docker-api


【解决方案1】:

您正在安装目录/src/storage,但正在上传到/usr/src/app/src/storage/
更改自:

`${path.resolve("./src/storage")}/${brand.text}-${slugify(name)}-thumbnail${ext}`;

到:

`${path.resolve("/src/storage")}

【讨论】:

  • 我这样做了,它在 docker 容器中运行良好,但在 MacOS 中它失败了。我改为path.join(__dirname, '../storage'),效果很好。但音量不起作用(并且没有错误)。
猜你喜欢
  • 2016-11-18
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 2017-03-22
  • 2021-01-16
相关资源
最近更新 更多