2016-08-05 30 views
0

Ich habe eine App, die ich auf einem einzigen eigenständigen Docker-Image ausführen möchte. Ich hatte es läuft gut auf einem Ubuntu based image, aber das gleiche Skript verursacht jetzt Probleme auf Alpine.Bash-Skript kann Knoten auf Docker-Image nicht ausführen

Hier ist meine Docker-Datei:

FROM julienlengrand/alpine-node-rethinkdb 

# Preparing 
# RUN ln -snf /bin/bash /bin/sh 

# # Define mountable directories. 
VOLUME ["/data"] 

# # Define working directory. 
WORKDIR /data 

# # Install app dependencies 
COPY package.json /data 
RUN npm install 

# # Bundle app source 
COPY . /data 

# # Expose rethinkdb ports. 
# - 8080: web UI 
# - 28015: process 
# - 29015: cluster 
EXPOSE 8080 
#EXPOSE 28015 
#EXPOSE 29015 

# Expose node app ports 
EXPOSE 4567 

CMD [ "/bin/sh", "/data/startApp.sh" ] 

Mein startApp Skript ist relativ einfach:

#!/bin/sh 
rethinkdb --bind all & sleep 1; node dbCreate.js; sleep 2; nohup node workers/worker.js & node app.js 

Aber wenn ich versuche, es zu laufen lasse, erhalte ich folgende Fehlermeldung:

module.js:442 
    throw err; 
    ^

'rror: Cannot find module '/data/app.js 
    at Function.Module._resolveFilename (module.js:440:15) 
    at Function.Module._load (module.js:388:25) 
    at Module.runMain (module.js:575:10) 
    at run (bootstrap_node.js:352:7) 
    at startup (bootstrap_node.js:144:9) 
    at bootstrap_node.js:467:3 

Dies passiert, ob ich es automatisch oder direkt innerhalb des Bildes mit der Shell ausführen.

Ich habe überprüft und alles ist korrekt im Datenordner platziert. Wenn ich alle Befehle nacheinander direkt in der sh-Shell ausführe, läuft alles wie erwartet.

Ich habe auch mein Skript versucht, als solche zu vereinfachen:

#!/bin/sh 
rethinkdb --bind all & sleep 1; node dbCreate.js; sleep 2; node app.js 

bu das gleiche Problem passiert.

Irgendeine Idee was schief gehen kann? Was könnte meinen/data-Ordner bei der Ausführung über das startApp-Skript nicht verfügbar machen? Könnte es sein, dass es eine Besonderheit von Alpine ist?

Danke,

+1

Ein Vorschlag, obwohl nicht alles auf einem einzigen Docker Bild setzen. Think 'microservices' - ein einzelner Andock-Container sollte nur eine Sache machen. Sie sollten einen Container für Ihre NodeJS-App und einen weiteren für RethinkDB haben. Sie würden 'docker-compose' verwenden, um diese Container einfach zu orchestrieren, so sollten Docker-basierte Apps funktionieren. – huygn

+0

Hey @HuyGiang. Ja, Sie haben vollkommen Recht, und das wollen wir auch. Betrachten Sie dies als einen notwendigen mittleren Schritt :). – jlengrand

+0

Ich würde mit 2 getrennten Container von Anfang an beginnen, da das Erstellen des Bildes viel einfacher wäre, gibt es offizielle Bilder für Node und RethinkDB und Sie können Ihren Node-Container ohne benutzerdefinierte Startskript einfacher debuggen. – huygn

Antwort

1

Die Fehlermeldung Sie sieht aus wie eine klassische Wagenrücklauf Ausgabe als Zitat nach app.js bewegt hat zum Start der Linie

'rror: Cannot find module '/data/app.js 

Knoten sollten normalerweise in der Lage sein, zu beschäftigen erhalten mit beiden Zeilenenden aber Shell-Skripte sind nicht so nett.

Ich im Allgemeinen alle Projekte/Dateien/Editoren/Git auf einen Unix \n Standard, es sei denn, dass bestimmte Anforderungen nicht zu.

Sie können vorhandene Dateien mit dos2unix oder eine der Antworten in question jlengrand found konvertieren. Ich mag perl -pi -e 's/\r\n/\n/g', weil pie

+0

In der Tat. Das Problem kam von einem Windows-Wagenrücklauf in meinem startApp.sh-Skript. Ich habe es auf der Host-Seite mit der hier beschriebenen Methode entfernt: http://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-n-in- bash-script – jlengrand

+0

Interessieren Sie sich für diese Datei aufgrund der Argumente für 'node'? Ich versuche herauszufinden, wie der Wagenrücklauf in den Modullader gelangt ist. – Matt

+0

Nein, das einzige, was ich im Skript mache, ist den Knoten app.js aufzurufen. Ich habe die Knotenskripte nicht berührt. Ich war auch ein wenig überrascht, dass es genug war, tbh und ich hatte erwartet, dass ich die Knoten-App ebenfalls unixixen musste. – jlengrand