node.js - Node 应用程序无法读取 Docker 镜像中的文件系统

标签 node.js docker dockerfile

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

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

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

我相信这可能与 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);
}); 

最佳答案

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

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

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

关于node.js - Node 应用程序无法读取 Docker 镜像中的文件系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35517791/

相关文章:

javascript - 请求对象和响应对象

node.js - 如何仅在提交更改后而不是更改期间提交更新的照片?

javascript - 无法对 NodeApp 进行 dockerize

arrays - Docker 撰写 .env 文件数组变量

bash - Docker Ubuntu 环境变量

java - war文件如何在docker容器的tomcat中创建目录

node.js - 判断预保存回调中是否有记录 "is new"

node.js - new Function 和 vm 有什么区别?

docker - RabbitMq-Docker-compose-如何修复 'Connection refused 127.0.0.1:5672'异常

unix - Docker - 无法远程登录链接的容器