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)
挑战在于确定节点脚本执行的预期位置和 docker 中的实际工作目录。这种差异将导致您期望的“.”文件路径之间的差异。是什么以及它实际上是什么。
确定您是否在您认为的上下文中执行的最简单方法是控制台出Fs.realpathSync(".")
我希望该位置不是您认为执行的位置(但它应该与您WORKDIR
在 Docker 中设置的位置相匹配)图像)。(您还可以通过暂时将“.”路径更改为绝对路径来证明这是您的问题。)
更改您的工作目录以指向您期望“.”的位置。是(在你的情况下WORKDIR /src
)并且你应该能够使用“。” 正如您所期望的那样。
ENOENT
表示不存在这样的目录项;文件 ./classes/cs395 不存在,因此fs
无法读取它。检查之前和之后是否存在。
请参阅为什么 ENOENT 表示“没有这样的文件或目录”?了解更多信息。
由于应用程序重新启动后它就可以工作,一种可能性是该文件是在应用程序首次运行后创建的,并且您试图在创建它之前读取它。
归档时间: |
|
查看次数: |
7019 次 |
最近记录: |