节点应用程序无法在Docker镜像中读取文件系统

时间:2016-02-20 00:58:44

标签: node.js docker dockerfile

好的,所以我有一个节点应用程序,可以访问它的文件结构中的目录并对其进行处理。我正在使用&#f;'模块来完成这个。当我从其图像运行容器时,我收到以下错误:

Error: ENOENT, readdir './classes/cs395'

我立即想到了一大堆可能出错的东西UNTIL我连接到正在运行的容器(重启之后因为容器会因错误而死...当然)。当我从容器内部启动节点应用程序时..工作..没有错误。

我相信它可能与Docker镜像分层时处理文件系统的方式有关但当我连接到容器时工作正常我真的很困惑

编辑:

文件存在......这里的证明: enter image description here 再说一遍,如果(因为我正如图所示连接到容器)我运行node server.js并ping ip:port一切都很好!目录被识别!但不是如果从图像中分离出来的话。

要显示该文件仍然存在,让我们启动已停止的容器并附加到它...正如您所见,文件仍然存在。 (请注意,启动容器不会重新创建文件,当它停止时它不在那里......它只会从它停止的地方拾取) enter image description here

如果它有帮助,这就是我如何使用' 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);
}); 

2 个答案:

答案 0 :(得分:0)

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

有关详细信息,请参阅Why does ENOENT mean "No such file or directory"?

一旦应用程序重新启动它就可以正常工作,一种可能是文件是在应用程序首次运行时创建的,并且您在创建应用程序之前尝试读取该文件。

答案 1 :(得分:0)

挑战在于识别节点脚本执行的预期位置和docker中的实际工作目录。这种差异将解释您期望的文件路径与#34;。#34;之间的差异。是和它实际上是什么。

确定您是否使用您认为的上下文执行的最简单方法是调出Fs.realpathSync(".")我希望该位置不是您认为执行的位置(但它应该与你的Docker镜像中WORKDIR的设置是什么。 (你也可以通过暂时改变你的"。"路径到绝对路径来证明这是你的问题。)

将您的工作目录更改为指向您所期望的"。"是(在你的情况下是WORKDIR /src),你应该能够使用"。"你期望的方式。