2016-02-20 54 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),你應該可以使用「。」你期望的方式。

相關問題