Node 应用程序无法读取 Docker 映像中的文件系统

fra*_*eco 5 node.js docker dockerfile

好吧,我有一个节点应用程序,可以访问其文件结构中的目录并对其进行处理。我正在使用“fs”模块来完成此任务。当我从其映像运行容器时,出现以下错误:

Error: ENOENT, readdir './classes/cs395'
Run Code Online (Sandbox Code Playgroud)

我立即想到了一大堆可能会出错的事情,直到我附加到正在运行的容器(重新启动它之后,因为容器会因错误而死亡......当然)。当我从容器内部启动节点应用程序时..它工作了..没有错误。

我相信这可能与 docker 镜像分层时处理文件系统的方式有关,但是当我附加到容器时它工作正常时我变得非常困惑

编辑:

该文件确实存在......这是证明: 在此输入图像描述 再次,如果(如图所示我连接到容器)我运行node server.js并 ping ip:port 一切都很好!目录已识别!但如果与图像分离运行则不然。

为了表明该文件仍然存在,让我们启动已停止的容器并附加到它......正如您所看到的,该文件仍然存在。(请注意,启动容器不会重新创建停止时不存在的文件......它只会从停止的地方开始) 在此输入图像描述

如果有帮助,以下是我使用“fs”模块的方式:

var p = "./classes/cs395";

//READ ALL FILES FROM A DIRECTORY AND EMIT THE NAME OF THE FILE
fs.readdir(p, function(err, files){
    if (err) throw err;

    files.forEach(function (file) {
        if (files.length == 1 && file == '.DS_Store'){
            io.emit('receive_file', null);
        } else {
            fs.stat(p + '/' + file, function(err, stats){
                if (err) throw err;

                if (stats.isFile() && file != '.DS_Store'){
                    var ext = path.extname(file);
                    var name = path.basename(p + '/' + file, ext);
                    io.emit('receive_file', name);
                }
            });

        }
    });  

    if (files.length == 0) {
        io.emit('receive_file', null);
    }    

    console.log(files);
}); 
Run Code Online (Sandbox Code Playgroud)

pur*_*101 6

挑战在于确定节点脚本执行的预期位置和 docker 中的实际工作目录。这种差异将导致您期望的“.”文件路径之间的差异。是什么以及它实际上是什么。

确定您是否在您认为的上下文中执行的最简单方法是控制台出Fs.realpathSync(".")我希望该位置不是您认为执行的位置(但它应该与您WORKDIR在 Docker 中设置的位置相匹配)图像)。(您还可以通过暂时将“.”路径更改为绝对路径来证明这是您的问题。)

更改您的工作目录以指向您期望“.”的位置。是(在你的情况下WORKDIR /src)并且你应该能够使用“。” 正如您所期望的那样。


max*_*ax_ 1

ENOENT表示不存在这样的目录项;文件 ./classes/cs395 不存在,因此fs无法读取它。检查之前和之后是否存在。

请参阅为什么 ENOENT 表示“没有这样的文件或目录”?了解更多信息。

由于应用程序重新启动后它就可以工作,一种可能性是该文件是在应用程序首次运行后创建的,并且您试图在创建它之前读取它。