2016-02-20 3 views
3

Хорошо, поэтому у меня есть приложение для узла, которое обращается к каталогу в его файловой структуре и делает что-то с ним. Я использую модуль «fs» для выполнения этого. Когда я запускаю контейнер из его образа, я получаю следующее сообщение об ошибке:Приложение Node не может читать файловую систему в Docker Image

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

Я сразу подумал о целой куче вещей, которые могли бы быть неправильно, пока я не прикреплен к запущенному контейнера (после перезагрузки, потому что контейнер будет умереть при ошибке ... конечно). Когда я запустил приложение-узел изнутри контейнера ... он работал ... с ошибками.

Я считаю, что это, возможно, что-то делать с тем, как файловые системы обрабатываются при Докер изображения наслаиваются, но, когда он работал хорошо, когда я прикрепил к контейнеру я стал действительно запутался

EDIT:

файл ДЕЙСТВИТЕЛЬНО существует ... вот доказательство: enter image description here Опять же, если (поскольку я прикреплен к контейнеру, как показано на рисунке), я запустил node server.js и пинг 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

«UNTIL Я прикреплен к работающему контейнеру (после перезапуска) - существует ли файл до перезагрузки при новой установке? –

+0

см. Мое новое редактирование – frankgreco

0

Задача заключается в определении ожидаемого места выполнения сценария узла и фактического рабочего каталога в докере. Эта разница будет учитывать расхождения между тем, что вы ожидаете от пути к файлу. быть и что это на самом деле.

Самый простой способ определить, если вы выполняете с контекстом вы думаете, это утешает вне Fs.realpathSync(".") я бы ожидать, что место не там, где вы думали исполнение из (но он должен соответствовать с тем, что ваш WORKDIR установлен на вашем изображении Docker). (Вы также можете доказать, что это ваша проблема, временно изменяя ваши пути «.» К абсолютным.)

Измените рабочий каталог, чтобы указать, где вы ожидаете своего «.». быть (в вашем случае WORKDIR /src), и вы должны иметь возможность использовать «.». как вы ожидаете.

Смежные вопросы