2014-11-05 2 views
8

Ich benutze Docker, so dass dieser Fall seltsam aussehen könnte. Aber ich möchte mein gesamtes Verzeichnis /data in meinem Docker Container bei der Entwicklung montiert werden.npm package.json und docker (montage es ...)

Meine /data Ordner Container meine package.json Datei, ein app Verzeichnis und eine Menge anderer Sachen. Das Problem ist, dass ich möchte, dass meine node_modules Ordner nicht persistent sein, nur die package.json Datei.

ich ein paar Dinge ausprobiert haben, aber package.json und npm ist mir eine harte Zeit hier ...

  • Montage der package.json Datei wird direkt npm brechen. npm versucht, die Datei beim Speichern umzubenennen, was bei einer gemounteten Datei nicht möglich ist.
  • Durch das Mounten des übergeordneten Ordners (/data) wird der Ordner node_modules geladen.
  • Ich kann jede Konfigurationsoption finden node_modules in einem anderen Ordner außerhalb /data, die /data/conf als Volumen anstelle nicht funktionieren Montage /dist
  • Putting package.json in /data/conf setzen Beispiel. Ich kann keine Möglichkeit finden, den Pfad package.json in npmrc anzugeben.
  • Putting package.json in /data/conf und symlinking es zu /data/package.json nicht arbeiten. npm unterbricht den Symlink und ersetzt ihn durch eine Datei.

Kopieren von Daten hin und her zu/aus dem Innern der Docker Behälter ist, wie ich es jetzt .. Ein wenig langweilig mache .. Ich will auch eine saubere Lösung ..

+0

Es ist ein schweres Instrument, aber würde eine unionfs-Überlagerung Ihre Probleme nicht lösen? – Wrikken

+0

Da die Datei als Mountpoint im Container sichtbar ist, spielt es keine Rolle. Es ist nicht in der Lage, die Datei umzubenennen (zu ersetzen), da es nach dem Ersetzen vom Mountpoint getrennt wird. – xeor

+0

Ich tat dies mit dem globalen Installationspfad: http://www.saulshanabrook.com/npm-docker-sharing -volumes/ –

Antwort

7

Wie Sie bereits geantwortet haben, denke ich, dass dies die einzige Lösung sein könnte.

Wenn Sie bauen Ihr Docker Bild, so etwas wie:

COPY data/package.json /data/ 
RUN mkdir /dist/node_modules && ln -s /dist/node_modules /data/node_modules && cd /data && npm install 

Und für andere Sachen (wie Bower, das gleiche tun)

COPY data/.bowerrc /data/ 
COPY data/bower.json /data/ 
RUN mkdir /dist/vendor && ln -s /dist/vendor /data/vendor && cd /data && bower install --allow-root 

Und COPY data/ /data am Ende (so Sie können Dockers-Caching verwenden und müssen die Installation von npm/docker nicht vornehmen, wenn eine Änderung an data vorgenommen wird.

Sie müssen auch die Symlinks, die Sie benötigen, erstellen und in Ihrem Git-Repo speichern. Sie werden äußerlich ungültig sein, aber werden wahrscheinlich auf der Innenseite Ihres Containers funktionieren.

Mit dieser Lösung können Sie Ihre $PWD/data:/data montieren, ohne die npm/bower "Müll" außerhalb Ihres Containers zu bekommen. Und Sie können Ihr Image weiterhin als eigenständige Bereitstellung Ihres Service erstellen.

0

Vielleicht können Sie Ihre Container speichern und dann mit einem minimalen dockerfile

VON my_container

und eine .dockerignore Datei mit

/data/node_modules

wieder aufbauen regelmäßig

Siehe die doc http://docs.docker.com/reference/builder/#the-dockerignore-file

+1

In einer Entwicklungsumgebung, in der es viele Änderungen gibt und mit fig das env hochgefahren wird, ist dies keine gute Lösung. Das einzige Problem ist die Datei package.json, keine der anderen. Diese Lösung wird auch alles viel komplizierter machen. – xeor

1

Die Lösung, die ich mit war Platzierung der node_modules Ordner in /dist/node_modules ging, und einen symbolischen Link, um es von /data/node_modules machen. Ich kann dies sowohl in meiner Dockerfile tun, so wird es es beim Aufbau verwenden, und ich kann meine Symlinks zu meinem Git-Repo senden. Alles hat gut funktioniert.

4

Eine ähnliche und alternative Möglichkeit besteht darin, die NODE_ENV-Variable zu verwenden, anstatt einen Symlink zu erstellen.

RUN mkdir -p /dist/node_modules RUN cp -r node_modules/* /dist/node_modules/ ENV NODE_PATH /dist/node_modules

Hier erstellen Sie zunächst ein neues Verzeichnis für node_modules, alle Module dort kopieren und haben Knoten die Module von dort lesen.

+0

Es wird nicht funktionieren, wenn wir den 'grunt' Befehl ausführen müssen. – lvarayut

3

Ich habe nun schon seit einiger Zeit, dieses Problem wurde, und die akzeptierte Lösung nicht für mich arbeiten *

Ich fand diesen link, die bearbeitet hatten zeigen here und dies in der Tat für mich gearbeitet:

volumes: 
    - ./:/data 
    - /data/node_modules 

In diesem Fall erzeugt der Motor ein Volumen (siehe Compose reference auf volumes), die zu Ihrem Quellverzeichnis nicht angebracht ist. Dies war die einfachste Lösung und bedurften mich keine symbolischen Links zu tun, Wege Einstellung usw.

Als Referenz meine einfache Dockerfile sieht aus wie folgt:

# install node requirements 
WORKDIR /data 
COPY ./package.json ./package.json 
RUN npm install -qq 

# add source code 
COPY ./ ./ 

# run watch script 
CMD npm run watch 

(Das watch Skript ist nur webpack --watch -d)

Hoffe, das ist in der Lage, jemandem zu helfen und speichern Stunden wie es für mich getan hat!


‚*‘ = ich nicht webpack bekommen konnte von meinem package.json Skripte zu arbeiten und etwas zu installieren, während im Inneren des Behälters geschaffen, um die node_modules Ordner mit dem, was ich gerade installiert (ich laufe npm i --save [packages] aus dem Inneren des Behälters das Paket Update zu erhalten die package.json bis zum nächsten Wiederaufbau)