2016-10-25 37 views
5

Tôi hiện đang làm bước đầu tiên của tôi với Docker và cố gắng sử dụng docker-compose để chạy ứng dụng của tôi:Sử dụng nút-sass với Docker-soạn

Node-Backend: HAPI
JS-Frontend: góc
MongoDB cơ sở dữ liệu

Các MongoDB kết hợp với các công trình Docker justfine. Tôi đang phát triển trên máy OSX và sử dụng nút-sass cho phần giao diện người dùng. Khi soạn có một lỗi:

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. 

Các nút-sass mô-đun dường như cần bindings linux nhưng chỉ có bindings OSX bên trong container. Vì vậy, câu hỏi đặt ra là: Có cách nào thông minh để giải quyết vấn đề này sao cho ngay cả quá trình dev vẫn thoải mái?

Cho đến giờ tôi không có bất kỳ Dockerfile nào. Nhưng docker-compose.yml của tôi trông giống như:

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" 
    } 

Cảm ơn !!

chỉnh sửa: thư mục cục bộ của tôi ./ được gắn kết vào vùng chứa, vì vậy các mô-đun gắn kết OSX của tôi cũng được gắn kết. Có cách nào thông minh để thực hiện npm i mới trong vùng chứa mà không có bất kỳ hạn chế lớn hơn nào đối với quy trình phát triển không?

+0

Bất kỳ tiến triển nào về điều này, có giải pháp nào không? Tôi có vấn đề chính xác như nhau. – Yves

Trả lời

0

Bạn nên chỉnh sửa hình ảnh npm của mình để tạo hình ảnh npm của riêng bạn chạy npm install bên trong nó thay vì chỉ npm start. Vì vậy, các gói npm bên trong vùng chứa sẽ tương thích với hệ điều hành vùng chứa. Bạn có thể kiểm tra https://github.com/titouanfreville/SupJirallo (Tôi đã không sử dụng nút-sass nhưng nó có một hình ảnh nút với npm cài đặt).

+0

cảm ơn! với giải pháp này, quá trình dev không bỏ thông minh nữa:/Bu tuy nhiên cảm ơn! :) – fheck

+0

Bạn có ý nghĩa gì bởi không khá thông minh? :) Tôi không nghĩ rằng nó thay đổi rất nhiều từ những gì bạn đã làm khi bạn chỉ xây dựng npm bên trong container nhưng vẫn sử dụng một khối lượng để xem các tập tin cập nhật. Nó khá thích nghi với quá trình dev. Bạn không phải cài đặt npm trên môi trường của chính mình vì nó nằm trong vùng chứa và mã nguồn bên trong vùng chứa được cập nhật với địa phương của bạn.Bao giờ tôi không có được những gì bạn muốn, bao giờ bạn không sử dụng docker với tư duy tốt :) - đoán nó là cái đầu tiên. –

2

Bạn cần chạy npm rebuild node-sass bên trong vùng chứa. Bạn đang gắn một nhị phân biên dịch cho OSX và cố gắng chạy trên Linux.

+0

cảm ơn! với giải pháp này, quá trình dev không bỏ thông minh nữa:/Bu tuy nhiên cảm ơn! :) – fheck

1

Đây có thể là tin tức cũ, nhưng trong trường hợp bất cứ ai khác chạy vào này ...

Run npm install bên trong container của bạn (để xây dựng các ràng buộc cho môi trường chứa của bạn chạy trong)

Sau đó, sao chép ràng buộc từ node_modules/node-sass/vendor/ vào môi trường dev.

Tôi thực hiện việc này trên máy Mac cho env dev nhưng một nút: alpine cho vùng chứa đang chạy.

+0

bạn có thể xây dựng không? –