2017-03-10 6 views
1

Ich habe ein Docker-Image, das Ubuntu installiert und RUN s einige zusätzliche Befehle wie die Installation von NodeJS.Probleme laufen npm installieren während docker-compose build

Die Dockerfile (in Kombination mit einer docker-compose.yml) mountet auch ein Verzeichnis in ein Verzeichnis auf dem Host. Das sieht wie folgt aus:

services: 
    test: 
    build: 
     context: ../../ 
     dockerfile: docker/Dev/Dockerfile 
    ports: 
     - 7000:7000 
    volumes: 
     - ./../../src:/src 

Im Dockerfile ich die folgenden Zeilen für ein Volumen haben:

VOLUME ["/src"] 
WORKDIR /src 

Wenn ich den Behälter mit docker-compose up laufen und dann eine ls -a innen montierten src/ Ordner des Container, dann sehe ich alle Dateien, die ich auch auf dem Host sehe. So weit, ist es gut.

(Command I auch im Innern des Behälter aussehen laufen: docker exec -it <container hash> ls -a)

Da alle Dateien dort zu sein scheinen, ein package.json einschließlich ich einen neuen RUN Befehl meines Dockerfile hinzugefügt, die ist: npm install. Also ich habe dies:

VOLUME ["/src"] 
WORKDIR /src 
RUN npm install 

Außer, dass ist mir ein Fehler, dass sie keine package.json im src/ Ordner finden.

Als ich hinzufügen, ein RUN ls -a (zur Erinnerung, ich mit WORKDIR zum src/ Ordner eingeschaltet), dann zeigt es, dass es ein leeres Verzeichnis ...

So in Dockerfile ich habe:

VOLUME ["/src"] 
WORKDIR /src 

# shows that /src is empty. If I do 'RUN pwd', then it shows I really am in /src 
RUN ls -a 
RUN npm install 

Aber immer noch, nachdem ich eine docker-compose up und dann wieder eine ls -a innerhalb der /src Ordner des Containers tun, zeigt es alle meine Quelldateien wieder.

Also meine Frage ist, warum sind sie nicht während der Bauzeit (ich bin docker-compose build) laufen?

Wie kann dieses Problem behoben werden?

Antwort

3

Sie Mißverständnis die Differenz zwischen dem VOLUME Befehl in einem Dockerfile und die -v Flag an den docker Daemon (was docker-compose für seine Volumes verwendet). beendet Gebäude

Die Werte unter der volumes Schlüssel in Ihrer docker-compose Datei sagen docker, welche Verzeichnisse in nach Ihr Bild abzubilden. Sie werden während des Erstellungsprozesses nicht verwendet.

Glücklicherweise haben Sie automatisch Zugriff auf alle Ihre Quelldateien, aufgrund der Zeile in Ihrer Datei verfassen - sie sind nur in der lokalen src Verzeichnis, nicht Ihr derzeitiges Arbeitsverzeichnis!

Versuchen Sie, Ihre Dockerfile auf die folgende Aktualisierung:

# NOTE: You don't want a VOLUME directive if you only want to mount a local 
# directory. WORKDIR is optional, but doesn't matter for my example, 
# so I'm omitting it. 

# Copy the npm files into your Docker image. If you do this first, the docker 
# daemon can cache the built layers, making your images build faster and be 
# substantially smaller, since most of your dependencies will remain unchanged 
# between builds. 
COPY src/package.json package.json 
COPY src/npm-shrinkwrap.json npm-shrinkwrap.json 

# Actually install the dependencies. 
RUN npm install 

# Copy all of your source files from the `src` directory into the Docker image. 
COPY src . 

Jetzt, ein Problem hier: Sie wahrscheinlich bereits Ihre npm unter src/node_modules installierten Module. Sie können also entweder alles über die letzte COPY Zeile hinauswerfen oder Sie können src/node_modules zu einer .dockerignore Datei in Ihrem Build-Stamm hinzufügen (../..).

+0

Ich spielte wieder damit herum. Der 'COPY'-Befehl macht den Trick, indem er meine' package.json' in den '/ src'-Ordner kopiert. Ich kann dann auch eine 'RUN npm install' machen, die auch funktioniert. Es zeigt, dass es einen 'node_modules'-Ordner erstellt. Aber wenn ich "docker-compose up" starte, überschreibt es alles, was die 'Dockerfile' im'/src'-Verzeichnis abgelegt hat. Ich nehme an, das liegt daran, dass 'docker-compose.yml' ein' -v' im selben '/ src'-Ordner erstellt und somit den gesamten vorherigen Inhalt überschreibt? – Vivendi

+0

Rechts. Durch das Mounten eines lokalen Verzeichnisses werden alle übereinstimmenden Inhalte im Image durch die Inhalte von Ihrem lokalen Laufwerk ersetzt. Dies möchten Sie in der Regel nur während der Entwicklung tun. – jkinkead