2016-02-20 56 views
3

好吧,我有一个节点应用程序,用于访问文件结构中的目录并执行其中的操作。我正在使用'fs'模块来完成这个任务。当我从它的形象运行的容器中,我得到以下错误:节点应用程序无法读取Docker映像中的文件系统

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

我马上想到的事情一大堆,可能是错的,直到我连接到正在运行的容器(重新启动它,因为容器后,将死于错误......当然)。当我从容器内启动节点应用时,它工作..没有错误。

我认为它可能是与当搬运工图像分层文件系统的处理方式,但是当它工作得很好,当我连接到容器我变得真的很困惑

编辑:

的文件是否存在...这里是证明: enter image description here 同样,如果(因为我连接到容器如图所示)我运行node server.js和ping IP:端口一切都很好!该目录被识别!但不是如果从图像中分离出来。

为了显示文件仍然存在,让我们开始我们停止的容器并将其附加到它上面......您可以看到文件仍然存在。 (需要注意的是启动容器不会重新创建它不存在,当它停止了文件......它只是拿起它离开的地方) 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); 
}); 

回答

0

ENOENT意味着不存在这样的目录条目; ./classes/cs395文件不存在,因此fs无法读取它。检查前后是否存在。

有关更多信息,请参见Why does ENOENT mean "No such file or directory"?

因为一旦应用程序重新启动,它就会工作,一种可能性是该应用程序第一次运行时创建的文件,并且在创建应用程序之前尝试读取该文件。

+0

如果仅仅是那样的问题。该文件是否存在....请参阅我编辑的问题。 – frankgreco

+0

“直到我连接到运行容器(后重新启动?” - 没有文件之前重新启动的一个新的存在安装 –

+0

看到我的新的编辑 – frankgreco

0

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

最简单的方法,以确定是否与上下文中执行你认为你是安慰了Fs.realpathSync(".")我期望的位置是不是你以为你是从执行(但它应该与你的WORKDIR匹配被设置在你的Docker镜像中)。 (您也可以证明这是通过临时改变,以绝对的人你的“”路径,你的问题。)

改变工作目录,你希望你的指向。“” (在你的情况下WORKDIR /src),你应该可以使用“。”你期望的方式。

相关问题