好吧,我有一个 Node 应用程序可以访问其文件结构中的目录并对其进行操作。我正在使用“fs”模块来完成此任务。当我从其图像运行容器时,出现以下错误:
Error: ENOENT, readdir './classes/cs395'
我立即想到了一大堆可能出错的事情,直到我连接到正在运行的容器(在重新启动它之后,因为容器会在出错时死掉......当然)。当我从容器内部启动 Node 应用程序时......它工作......没有错误。
我相信这可能与 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);
});
最佳答案
挑战在于确定 Node 脚本执行的预期位置和 docker 中的实际工作目录。这种差异将解释您期望的“.”文件路径之间的差异。成为和它实际上是什么。
确定您是否在您认为的上下文中执行的最简单方法是控制 Fs.realpathSync(".")
我希望该位置不是您认为的位置你正在执行(但它应该与你的 WORKDIR
在你的 Docker 图像中设置的相匹配)。 (您也可以通过暂时将“.”路径更改为绝对路径来证明这是您的问题。)
更改您的工作目录以指向您期望“.”的位置。是(在你的情况下 WORKDIR/src
)并且你应该能够使用“。”您期望的方式。
关于node.js - Node 应用程序无法读取 Docker 镜像中的文件系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35517791/