2016-07-09 8 views
1

Ich möchte Typoskript in meinem Node.js Web Server verwenden. Der Web-Server befindet sich jedoch in einem Docker-Container. Ich benutze das die Dockerfile wie der Schlag: von Knoten: neuesteKann das Typoskript in Docker nicht kompilieren

COPY code/ /usr/local/lib 
WORKDIR /usr/local/lib 

RUN npm install -g [email protected] 
RUN npm install -g sequelize 
RUN npm install -g mysql 
RUN npm install -g typescript 

CMD ["sh", "-c", "rm", "webApp.js"] 
CMD ["sh", "-c", "tsc", "webApp.ts"] 
CMD ["node", "webApp.js"] 

Nachdem ich bauen meine Docker finde ich, dass, werden keine webApp.js erzeugt werden, nachdem der CMD-Befehle. Warum und wie soll ich es lösen? Vielen Dank.

Antwort

0

Ich denke, das Problem ist die sh -c. Wenn Sie in Ihrer Konsole sh -c echo test eingeben, wird keine Ausgabe ausgegeben. Wenn Sie sh -c "echo test" oder nur echo test eingeben, wird es funktionieren. Das ist, weil nur das erste Argument ausgeführt wird (Schauen Sie in man sh).

Aber darüber hinaus ist es nicht notwendig. CMD ["rm", "webApp.js"] wird tun, was Sie wollen. Und wenn Sie es möchten, indem Sie bash ausgeführt werden/sh können Sie die Zeichenfolge Syntax verwenden CMD rm webApp.js

+0

Es tut mir leid, dass Ihre Methode nicht funktioniert hat. Es ist nicht das Problem des Befehlsformats, ich weiß nicht wie, aber die andere Antwort funktioniert für mich. Trotzdem danke für deine Freundlichkeit. – Andy

+0

Ja, die Antwort von Nguyen Sy Thanh Son ist richtig. Die CMD wird von den anderen überschrieben – Julian

1

In der besten Praxis, wenn Sie eine Dockerfile erstellen, sollten Sie nur Benutzer ein CMD und ein ENTRYPOINT.

In Ihrem Fall sollte es sein:

COPY code/ /usr/local/lib 
WORKDIR /usr/local/lib 

RUN npm install -g [email protected] 
RUN npm install -g sequelize 
RUN npm install -g mysql 
RUN npm install -g typescript 

RUN sh -c rm webApp.js 
RUN sh -c tsc webApp.ts 
CMD ["node", "webApp.js"] 
+0

Danke, es funktioniert für mich. Obwohl die js-Datei immer noch nicht in meinem Ordner außerhalb der Dockers zu sehen ist, liegt der Grund wahrscheinlich darin, dass der Cache nicht sofort flutet. – Andy

+0

Die js-Datei wird im Container generiert, sodass sie im neu erstellten Container gespeichert wird. Wenn Sie es außerhalb haben möchten, müssen Sie den Container mit einem Volume ausführen. – Julian

0

Toller Start!

können Sie überprüfen, wie ich diese Docker/NodeJS/Typescript starter project

Als eine andere Antwort bemerkte in meinem GitHub zu erreichen, sollten Sie nur ein CMD Befehl verwenden, so dass anstelle der Verwendung der CMD, sollten Sie RUN sh -c tsc webApp.ts verwenden. Dadurch wird das Typescript mithilfe des Befehlszeilentools tsc kompiliert, das Sie zuvor mithilfe von RUN npm install -g typescript im Container installiert haben.

Nachdem Sie dies getan und Ihre Dockerfile ausgeführt haben, können Sie erwarten, webApp.js jetzt in Ihrem Arbeitsordner (der Ordner, der Ihre Dockerfile hostet) zu sehen, aber Sie werden es nicht sehen. Der Container sieht es, aber Sie nicht. Was ist los?

Wenn Sie diese Befehle von Ihrer Dockerfile ausführen, führen Sie sie tatsächlich in dem Container aus, der in einem speziellen, abgelegenen Teil Ihres Rechners lebt. Dieser abgelegene Teil Ihrer Maschine und der Teil Ihrer Maschine, auf dem sich die Dockerfile befindet, sind zwei völlig getrennte Orte. Daher werden Sie die generierte .js Datei nicht sehen.

Zum Glück hat Docker eine Möglichkeit, Dateien zwischen diesen beiden Teilen Ihres Computers zu "mounten" oder zu spiegeln. Dies nennt man "volume".

Es gibt eine gute StackOverflow answer auf Bänden. Die Volume-Syntax ist in Ihrer Dockerdatei wie folgt: ADD . /path/inside/docker/container. Der Befehl ist folgendermaßen aufgebaut: ADD {my_filepath} {container_filepath}. Dies bedeutet, dass alles, was sich auf Ihrem Rechner in {my_filepath} befindet, jetzt im Pfad {container_filepath} in den Container "eingebunden" oder gespiegelt wird.

ADD . . würde Ihr aktuelles Arbeitsverzeichnis in das Hauptarbeitsverzeichnis des Containers mounten.