2016-08-06 28 views
1

Ich bin auf this guide folgen und meine Low Docker Wissen zu verwenden, um eine dev-Umgebung zum Laufen zu bringen. Ich habe eine Wand getroffen, die ich nicht lösen kann. Das ist mein docker-compose.yml:Docker komponieren nicht finden meine index.js

version: '2' 
services: 
    redis: 
    image: redis:3.2 
    mongo: 
    image: mongo:3.2 
    app: 
    build: . 
    ports: 
     - '3000:3000' 
    command: './node_modules/.bin/nodemon ./index.js' 
    environment: 
     NODE_ENV: development 
    volumes: 
     - .:/home/app/cardcreator 
     - /home/app/cardcreator/node_modules 
    depends_on: 
     - redis 
     - mongo 
    links: 
     - redis 
     - mongo 

und das ist mein Dockerfile:

FROM node:6.3.1 

RUN useradd --user-group --create-home --shell /bin/false app 

ENV HOME=/home/app 

COPY package.json npm-shrinkwrap.json $HOME/cardcreator/ 
RUN chown -R app:app $HOME/* 

USER app 
WORKDIR $HOME/cardcreator 
RUN npm install 

USER root 
COPY . $HOME/cardcreator/ 
RUN chown -R app:app $HOME/* 
USER app 

CMD ["node", "index.js"] 

Wenn ich versuche, die App über docker-compose up zu starten, erhalte ich die Fehler

app_1 | Usage: nodemon [nodemon options] [script.js] [args] 
app_1 | See "nodemon --help" for more. 

ich das dann entfernt command Linie von meinem docker-compose.yml, nur verlassen node index.js zu starten. Ich bekomme eine Fehlermeldung, dass index.js nicht gefunden werden kann.

Die Datei ist in meinem Projektordner, es ist dort und es hat Inhalt. Ich kann nicht herausfinden, warum dieses Setup nicht funktioniert, ich habe ähnliche Setups für Tails gemacht und es hat gut funktioniert.

Kann mir jemand sagen, was ich hier falsch mache?

+0

In welcher Docker-Version und Umgebung laufen Sie? Es sieht so aus, als ob Ihr Volume-Mount nicht so läuft, wie Sie es erwarten, wie es bei Docker VMs in Mac/Win üblich ist. – BMitch

+0

@BMitch Ich betreibe tatsächlich Docker 1.12 auf Windows 10. Irgendwelche Vorschläge? – Lanbo

Antwort

1

Was auch immer Sie in Ihrem compose Datei Montage sind hier:

- .:/home/app/cardcreator 

oben montieren Wird von was auch immer Sie in $HOME/cardcreator/ gebaut in deiner Dockerdatei.

Also im Grunde scheinen Sie widersprüchliche Volumes zu haben - es ist eine Reihenfolge der Operationen Problem - der Build wird zuerst passieren und die Datenträger mount passiert später, wenn der Container ausgeführt wird, so dass Ihr Container nicht mehr Zugriff auf die haben Dateien in der Dockerfile gebaut.

+0

Sie haben Recht, das ist es! Aber ich habe diese Konfigurationsoption schon einmal für Rails verwendet - um zu vermeiden, dass ich die gesamte App jedes Mal neu erstellen muss, wenn ich eine Datei ändere. Kann ich das hier aus irgendeinem Grund nicht tun? – Lanbo

+0

Sie müssen nur Ihre Verzeichnisstruktur entwerfen, damit die Dateien, die Sie ändern können, nicht in Konflikt mit den Dateien stehen, die Sie in Ihrer Dockerfile erstellen. Wenn Sie Ihre Dockerfile so strukturieren, dass die Dateien, die Sie ändern, in den Anweisungen für die letzte Ausführung enthalten sind, werden alle oben erstellten Ebenen erneut verwendet. Daher sollte der Neuaufbau ziemlich schnell sein. Sie können sogar Tests in Ihrem Build ausführen, um nach eingeführten Fehlern zu suchen. Im Allgemeinen sollte es keinen Grund geben, node_modules auf einem Volume zu speichern. Sie können sogar auf eine oder zwei Dateien verlinken, wenn Sie möchten, aber es ist schön, wenn die gesamte App unveränderlich/eigenständig sein kann. – ldg

0

Sie könnten versuchen,

docker exec -it app_1 bash 

zu verwenden, um in den Behälter zu gehen und versuchen, den manuell

node index.js 

Befehl auszuführen und sehen, was los ist. Nicht zu 100% sicher, ob der ‚Knoten‘ Docker Bilder bash obwohl installiert haben ..

+0

Sie tun, aber da der Docker-Befehl mit einem Fehler beendet wird, wird der Container sofort gestoppt und ich kann keine Befehle erhalten, um darauf zu laufen. – Lanbo