2017-01-30 33 views
3

我试图dockerise我的节点应用程序。我目前的应用程序是一个使用postgresql的nodejs express服务器。 ExpressJS使用node-sass-middleware来处理sass资产。当我在我的OSX机器上本地运行node和postgresql时,一切正常。当我尝试用docker-compose运行应用程序,我得到一个“缺少绑定错误”发布到节点sass和Docker

这里是我的Dockerfile:

FROM node:7.2.1 
RUN apt-get update -qq && apt-get install -y build-essential 
RUN apt-get install -y libpq-dev postgresql-client 
ENV APP_HOME /my_app 
RUN mkdir $APP_HOME 
WORKDIR $APP_HOME 
ADD package.json . 
RUN npm install 
RUN npm rebuild node-sass 
ADD . . 
CMD [ "npm", "start" ] 
EXPOSE 3000 

这里是我的docker-compose.yml文件:

version: '2' 
services: 
    db: 
     image: postgres:9.6.1 
     ports: 
     - '5432:5432' 
    web: 
     build: . # use the Dockerfile next to this file 
     volumes: 
     - .:/my_app 
     ports: 
     - "3000:3000" 
     depends_on: 
     - db 

当我运行泊坞窗 - 组成我仍然得到以下错误:

web_1 | [nodemon] 1.11.0 
web_1 | [nodemon] to restart at any time, enter `rs` 
web_1 | [nodemon] watching: *.* 
web_1 | [nodemon] starting `node ./bin/www` 
web_1 | /my_app/node_modules/node-sass/lib/binding.js:15 
web_1 |  throw new Error(errors.missingBinary()); 
web_1 |  ^
web_1 | 
web_1 | Error: Missing binding /my_app/node_modules/node-sass/vendor/linux-x64-51/binding.node 
web_1 | Node Sass could not find a binding for your current environment: Linux 64-bit with Node.js 7.x 
web_1 | 
web_1 | Found bindings for the following environments: 
web_1 | - OS X 64-bit with Node.js 7.x 
web_1 | 
web_1 | This usually happens because your environment has changed since running `npm install`. 
web_1 | Run `npm rebuild node-sass` to build the binding for your current environment. 
web_1 |  at module.exports (/my_app/node_modules/node-sass/lib/binding.js:15:13) 
web_1 |  at Object.<anonymous> (/my_app/node_modules/node-sass/lib/index.js:14:35) 
web_1 |  at Module._compile (module.js:571:32) 
web_1 |  at Object.Module._extensions..js (module.js:580:10) 
web_1 |  at Module.load (module.js:488:32) 
web_1 |  at tryModuleLoad (module.js:447:12) 
web_1 |  at Function.Module._load (module.js:439:3) 
web_1 |  at Module.require (module.js:498:17) 
web_1 |  at require (internal/module.js:20:19) 
web_1 |  at Object.<anonymous> (/my_app/node_modules/node-sass-middleware/middleware.js:3:12) 
web_1 |  at Module._compile (module.js:571:32) 
web_1 |  at Object.Module._extensions..js (module.js:580:10) 
web_1 |  at Module.load (module.js:488:32) 
web_1 |  at tryModuleLoad (module.js:447:12) 
web_1 |  at Function.Module._load (module.js:439:3) 
web_1 |  at Module.require (module.js:498:17) 
web_1 | [nodemon] app crashed - waiting for file changes before starting... 

我虽然通过将RUN npm rebuild node-sass添加到Dockerfile中,它将为Docker容器中的操作系统构建正确的绑定...但它似乎不起作用。

有什么想法?

+0

您尝试安装的是哪个版本的node-sass-middleware/node-sass。节点7的支持只是最近添加了 – nschonni

+0

@nschonni我使用的节点sass中间件版本0.9.8 – jubeless

回答

5

对Node.js 7(对于Linux和OSX)的支持似乎已添加到节点sass v3.7.0中。确保你使用的版本等于或者比这更新。

要么你可以更新您的Dockerfile:

FROM node:7.2.1 
RUN apt-get update -qq && apt-get install -y build-essential 
RUN apt-get install -y libpq-dev postgresql-client 
ENV APP_HOME /my_app 
RUN mkdir $APP_HOME 
WORKDIR $APP_HOME 
ADD package.json . 

# Add the two entries below 
RUN mkdir -p node_modules/node-sass/vendor/linux-x64-51 
RUN curl -L https://github.com/sass/node-sass/releases/download/v4.5.0/linux-x64-51_binding.node -o node_modules/node-sass/vendor/linux-x64-51/binding.node 

RUN npm install 
RUN npm rebuild node-sass 
ADD . . 
CMD [ "npm", "start" ] 
EXPOSE 3000 

或者你可以从Dockerfile下载本地的绑定,然后建立一个没有任何修饰:

cd /path/to/node_app/node_modules 
mkdir -p node-sass/vendor/linux-x64-51 
curl -L https://github.com/sass/node-sass/releases/download/v4.5.0/linux-x64-51_binding.node -o node-sass/vendor/linux-x64-51/binding.node 

留意的不同版本预编译的本机绑定位于:https://github.com/sass/node-sass/releases

+0

我设法从本地获取绑定文件并从Dockerfile构建,但是现在我得到的新错误是: 'web_1 |错误:/my_app/node_modules/node-sass/vendor/linux-x64-51/binding.node:invalid ELF header' 想法? – jubeless

+0

不要在二进制回购上拉东西,它只是维护者的便笺簿,它将会消失。如果你要卷曲的二进制文件,使用生长激素释放附件 – nschonni

+0

我已经更新与GH释放链接的答案。 –