【问题标题】:Use node-sass with docker-compose使用 node-sass 和 docker-compose
【发布时间】:2016-10-25 08:54:04
【问题描述】:

我目前正在使用 docker 迈出第一步,并尝试使用 docker-compose 运行我的应用程序:

节点后端:hapi
JS 前端:angular
MongoDB 数据库

mongodb 与 docker 结合使用效果很好。我正在 OSX 机器上开发并使用 node-sass 作为前端部分。作曲时出现错误:

server_1  |     Child extract-text-webpack-plugin:
server_1  |       + 1 hidden modules
server_1  |     
server_1  |     ERROR in Missing binding /app/node_modules/node-sass/vendor/linux-x64-48/binding.node
server_1  |     Node Sass could not find a binding for your current environment: Linux 64-bit with Node.js 6.x
server_1  |     
server_1  |     Found bindings for the following environments:
server_1  |       - OS X 64-bit with Node.js 6.x
server_1  |     
server_1  |     This usually happens because your environment has changed since running `npm install`.
server_1  |     Run `npm rebuild node-sass` to build the binding for your current environment.

node-sass 模块似乎需要 linux 绑定,但容器内只有 osx 绑定。那么问题来了:有没有聪明的方法来解决这个问题,让即使是开发过程也很舒服?

到目前为止,我还没有任何Dockerfile。但我的docker-compose.yml 看起来像:

version: '2'
services:
  server:
    image: node:6
    command: 'npm start'
    working_dir: '/app'
    volumes:
      - ./:/app
    depends_on:
      - mongo
    ports:
      - '1337:1337'
    environment:
      - NODE_ENV=prod
    links:
      - mongo:mongodb
  mongo:
    image: mongo:latest
    ports:
      - '127.0.0.1:27017:27017'
    volumes:
      - ./data/:/data/db

还有package.json

...

  "dependencies": {
    "accepts": "^1.3.3",
    "akaya": "^0.3.0",
    "angular": "^1.5.8",
    "angular-ui-router": "next",
    "bcrypt": "^0.8.7",
    "blipp": "^2.3.0",
    "boom": "^4.2.0",
    "emojilib": "^2.0.2",
    "emojione": "^2.2.6",
    "glue": "^4.0.0",
    "good": "^7.0.2",
    "good-console": "^6.1.2",
    "good-file": "^6.0.1",
    "good-squeeze": "^5.0.0",
    "hapi": "^15.2.0",
    "hapi-auth-basic": "^4.2.0",
    "hapi-auth-jwt2": "^7.1.3",
    "inert": "^4.0.2",
    "joi": "^9.2.0",
    "jquery": "^3.1.1",
    "jsonwebtoken": "^7.1.9",
    "lodash": "^4.16.4",
    "mongoose": "^4.6.4",
    "pm2": "^2.0.18",
    "twemoji": "^2.2.0",
    "wurst": "^0.9.1"
  },
  "devDependencies": {
    "autoprefixer": "^6.5.1",
    "babel-cli": "^6.16.0",
    "babel-core": "^6.17.0",
    "babel-eslint": "^7.0.0",
    "babel-loader": "^6.2.5",
    "babel-plugin-transform-decorators-legacy": "^1.3.4",
    "babel-preset-es2015": "^6.16.0",
    "babel-preset-stage-0": "^6.16.0",
    "baggage-loader": "^0.2.4",
    "chokidar": "^1.6.1",
    "clean-webpack-plugin": "^0.1.13",
    "copy-webpack-plugin": "^3.0.1",
    "css-loader": "^0.25.0",
    "eslint": "^3.8.1",
    "eslint-config-airbnb-base": "^9.0.0",
    "eslint-loader": "^1.6.0",
    "eslint-plugin-import": "^2.0.1",
    "extract-text-webpack-plugin": "^1.0.1",
    "file-loader": "^0.9.0",
    "html-loader": "^0.4.4",
    "html-webpack-plugin": "^2.24.0",
    "inline-style-prefix-all": "^2.0.2",
    "json-loader": "^0.5.4",
    "ng-annotate-loader": "^0.2.0",
    "ngtemplate-loader": "^1.3.1",
    "node-sass": "^3.10.1",
    "postcss-loader": "^1.0.0",
    "sass-loader": "^4.0.2",
    "style-loader": "^0.13.1",
    "url-loader": "^0.5.7",
    "webpack": "^1.13.2",
    "webpack-livereload-plugin": "^0.9.0",
    "webpack-manifest-plugin": "^1.1.0",
    "webpack-md5-hash": "^0.0.5"
  },
  "engines": {
    "node": "6.0.0",
    "npm": "^3.8.8"
  }

谢谢!!

编辑:我的本地目录 ./ 被挂载到容器中,所以我的 OSX 绑定模块也被挂载。有没有一种聪明的方法可以在容器内创建一个新的npm i 而对开发过程没有更大的限制?

【问题讨论】:

  • 这方面有什么进展,有解决办法吗?我有完全相同的问题。

标签: docker docker-compose node-sass


【解决方案1】:

您需要在容器内运行npm rebuild node-sass。您正在安装为 OSX 编译的二进制文件并尝试在 Linux 上运行。

【讨论】:

  • 谢谢!有了这个解决方案,开发过程不再聪明了:/不过,谢谢! :)
【解决方案2】:

这可能是旧闻,但万一其他人遇到这个......

在您的容器内运行 npm install(为您的容器运行的环境构建绑定)

然后将绑定从node_modules/node-sass/vendor/复制到开发环境中。

我在 Mac 上为开发环境执行此操作,但在运行容器时使用 node:alpine。

【讨论】:

  • 你能详细说明一下吗?
【解决方案3】:

您应该编辑您的 npm 图像以在其中创建自己的运行 npm install 而不仅仅是 npm start。因此容器内的 npm 包将与容器操作系统兼容。 您可以查看https://github.com/titouanfreville/SupJirallo(我没有使用 node-sass,但它有一个带有 npm install 的节点映像)。

【讨论】:

  • 谢谢!有了这个解决方案,开发过程不再聪明了:/不过,谢谢! :)
  • 不太聪明是什么意思? :) 我认为它与您所做的事情并没有太大变化,因为您只是在容器内构建 npm,但仍然使用卷来查看更新的文件。它非常适应开发过程。您不必在自己的环境中安装 npm,因为它在容器中,并且容器内的源代码与您本地的源代码是最新的。曾经我没有得到你想要的东西,曾经你没有以良好的心态使用 docker :) - 猜它是第一个。
猜你喜欢
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 2017-06-16
  • 2022-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多