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,
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
Hey @HuyGiang. Ja, Sie haben vollkommen Recht, und das wollen wir auch. Betrachten Sie dies als einen notwendigen mittleren Schritt :). – jlengrand
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