2016-10-25 26 views
5

Jestem obecnie robi swoje pierwsze kroki z docker i próbuje użyć docker-compose uruchomić mój wniosek:użycie węzła Sass z docker-komponować

Node-backend: HAPI
JS-Frontend: kątową
MongoDB bazie

MongoDB w połączeniu z docker działa justfine. Pracuję na maszynie OSX i używam węzeł-sass dla części frontend. Podczas komponowania jest błąd:

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 moduł wydaje się potrzeba powiązania linux ale po prostu musi osx powiązań wewnątrz pojemnika. Pytanie brzmi: czy istnieje inteligentny sposób rozwiązania tego problemu, aby nawet proces dev był nadal wygodny?

Do tej pory nie mam żadnych Dockerfile. Ale moja docker-compose.yml wygląda następująco:

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 

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

Dzięki !!

edytuj: mój lokalny katalog ./ zostaje podłączony do kontenera, więc moje moduły powiązane z OSX również są montowane. Czy istnieje inteligentny sposób na wykonanie nowego npm i wewnątrz kontenera bez większych ograniczeń w procesie programowania?

+0

Jakieś postępy w tej sprawie, czy istnieje rozwiązanie? Mam dokładnie ten sam problem. – Yves

Odpowiedz

0

Powinieneś edytować swój obraz npm, aby utworzyć własny, a nie tylko npm install, tylko npm start. Pakiety npm wewnątrz kontenera będą kompatybilne z systemem operacyjnym kontenera. Możesz sprawdzić https://github.com/titouanfreville/SupJirallo (nie użyłem węzła-sass, ale ma obraz węzła z instalacją npm).

+0

dzięki! dzięki temu rozwiązaniu proces dev nie jest już inteligentny:/Bu, ale dzięki! :) – fheck

+0

Co rozumiesz przez niezupełnie mądre? :) Nie sądzę, żeby to się bardzo zmieniło od tego, co robiłeś, ponieważ właśnie budujesz npm wewnątrz kontenera, ale nadal korzystasz z woluminu, aby zobaczyć zaktualizowane pliki. Jest dość dostosowany do procesu deweloperskiego. Nie musisz instalować npm we własnym środowisku, ponieważ znajduje się on w kontenerze, a kod źródłowy wewnątrz kontenera jest aktualny w Twoim lokalnym.Kiedykolwiek nie dostaję tego, czego oczekujesz, nigdy nie używasz dockera z dobrym nastawieniem :) - zgadnij, że to pierwszy. –

2

Musisz uruchomić npm rebuild node-sass wewnątrz kontenera. Montujesz plik binarny skompilowany dla OSX i próbujesz uruchomić na Linuksie.

+0

dzięki! dzięki temu rozwiązaniu proces dev nie jest już inteligentny:/Bu, ale dzięki! :) – fheck

1

Może to być stare wiadomości, ale w przypadku ktoś prowadzi do tego ...

Run npm install wewnątrz pojemnika (budować wiązania dla środowiska Twój pojemnik biegnie w)

skopiuj wiązanie od node_modules/node-sass/vendor/ do środowiska deweloperów.

Robię to na komputerze Mac dla środowiska dev, ale węzeł: alpine dla uruchomionego kontenera.

+0

możesz rozwinąć? –