Ошибка: привязка `libsass` не была найдена в nodejs 4.2.4 lts, ​​но не в 5.4.1 с использованием докера

Я настраиваю контейнер докеров, используя nodejs 4.2.4 с помощью expressjs, используя sass.

Мой Dockerfile:

FROM node:4.2.4-wheezy
COPY myapp /srv/www/
RUN rm -r /srv/www/node_modules || echo "Not removing /srv/www/node_modules,     directory did not exist"

#RUN npm update
#RUN npm install -g --silent node-sass
RUN cd /srv/www && npm install --silent
#RUN cd /srv/www && npm rebuild node-sass

EXPOSE 3000

Проект express.js был сгенерирован с помощью их генератора

 express -css sass --hbs myapp

который генерирует скелет проекта с этим package.json:

{
 "name": "myapp",
 "version": "0.0.0",
 "private": true,
 "scripts": {
   "start": "node ./bin/www"
  },
   "dependencies": {
   "body-parser": "~1.13.2",
   "cookie-parser": "~1.3.5",
   "debug": "~2.2.0",
   "express": "~4.13.1",
   "hbs": "~3.1.0",
   "morgan": "~1.6.1",
   "node-sass-middleware": "0.8.0",
   "serve-favicon": "~2.3.0"
  }
}

Запуск этого на моем Mac с узлом 4.2.4 работает нормально, но запуск в контейнере докера дает следующую ошибку:

philipp@Philipps-MacBook-Pro:~/node/expressv1 $docker run -it -P -w="/srv/www/" test_server_7 npm start 
npm info it worked if it ends with ok
npm info using [email protected]
npm info using [email protected]
npm info prestart [email protected]
npm info start [email protected]

> [email protected] start /srv/www
> node ./bin/www

/srv/www/node_modules/node-sass-middleware/node_modules/node-sass/lib/extensions.js:158
    throw new Error([
    ^

Error: The `libsass` binding was not found in /srv/www/node_modules/node-sass-middleware/node_modules/node-sass/vendor/linux-x64-46/binding.node
This usually happens because your node version has changed.
Run `npm rebuild node-sass` to build the binding for your current node version.
    at Object.sass.getBinaryPath (/srv/www/node_modules/node-sass-middleware/node_modules/node-sass/lib/extensions.js:158:11)
    at Object.<anonymous> (/srv/www/node_modules/node-sass-middleware/node_modules/node-sass/lib/index.js:16:36)
    at Module._compile (module.js:435:26)
    at Object.Module._extensions..js (module.js:442:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:313:12)
    at Module.require (module.js:366:17)
    at require (module.js:385:17)
    at Object.<anonymous> (/srv/www/node_modules/node-sass-middleware/middleware.js:3:12)
    at Module._compile (module.js:435:26)

Однако, если я расширю образ докера из 5.4.1-wheezy, он будет работать нормально. Кажется, есть некоторые проблемы с libsass и node (​​здесь, здесь и здесь). Я попробовал все предложения в этих ссылках, некоторые из которых остались в Dockerfile выше, но ни один из них не дал никакого эффекта. В каком-то смысле для меня также не имеет смысла перестраивать node-sass, если я прихожу с чистой установки node. Какие-либо предложения?


person Philiiiiiipp    schedule 18.01.2016    source источник


Ответы (1)


Для тех, кто сталкивается с той же проблемой, проблема, как предложил пешо, здесь, было то, что npm 2.x, который устанавливается nodejs 4.2.4, не запускает сценарии в режиме root, что приводит к сбою этих двух сценариев:

npm WARN cannot run in wd [email protected] node scripts/install.js (wd=/srv/www/myapp/node_modules/node-sass-middleware/node_modules/node-sass)
npm WARN cannot run in wd [email protected] node scripts/build.js (wd=/srv/www/myapp/node_modules/node-sass-middleware/node_modules/node-sass)

Можно было запустить npm install с флагом --unsafe-perm, но, как следует из флага, это небезопасно. Лучшим способом было бы следовать передовым методам Starefossens и создать еще одного пользователя.

person Philiiiiiipp    schedule 18.01.2016