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?
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
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