2016-05-07 13 views
11

Ich habe eine Dockerfile, die ich von einem docker-compose.yml zeigen.Docker-komponieren Volume-Mount vor dem Lauf

Ich möchte die Datenträger-Mount in der Docker-Compose.yml vor der RUN in der Dockerfile passieren.

Dockerfile:

FROM node 

WORKDIR /usr/src/app 

RUN npm install --global gulp-cli \ 
&& npm install 

ENTRYPOINT gulp watch 

Docker-compose.yml

version: '2' 

services: 
    build_tools: 
    build: docker/gulp 
    volumes_from: 
     - build_data:rw 

    build_data: 
    image: debian:jessie 
    volumes: 
     - .:/usr/src/app 

Es macht durchaus Sinn, denn es ist die Dockerfile zuerst zu tun, montieren Sie dann von Docker-compose, jedoch ist es eine Möglichkeit, komm herum.

Ich möchte die Dockerfile generisch halten, während mehr spezifische Bits aus verfassen übergeben. Vielleicht ist das nicht die beste Praxis?

Antwort

15

Erik Dannenberg's ist richtig, die Volumenschichtung bedeutet, dass das, was ich versucht habe, keinen Sinn macht. (Es gibt eine andere wirklich gute Erklärung auf der Docker website, wenn Sie mehr lesen möchten). Wenn ich die npm install haben Docker wollen tun, dann könnte ich es wie folgt tun:

FROM node 

ADD . /usr/src/app 
WORKDIR /usr/src/app 

RUN npm install --global gulp-cli \ 
&& npm install 

CMD ["gulp", "watch"] 

Dies ist jedoch als Lösung für meine Situation nicht angemessen ist. Das Ziel ist es, NPM zu verwenden, um Projektabhängigkeiten zu installieren, und dann gulp auszuführen, um mein Projekt zu erstellen. Das bedeutet, dass ich Lese- und Schreibzugriff auf den Projektordner und benötige, der nach dem Entfernen des Containers beibehalten werden muss.


Ich brauche zwei Dinge zu tun, nachdem das Laufwerk aktiviert ist, so kam ich mit der folgenden Lösung bis ...

Docker/Zug/Dockerfile:

FROM node 

RUN npm install --global gulp-cli 

ADD start-gulp.sh . 

CMD ./start-gulp.sh 

Docker/schluck /start-gulp.sh:

#!/usr/bin/env bash 

until cd /usr/src/app && npm install 
do 
    echo "Retrying npm install" 
done 
gulp watch 

docker-compose.yml:

version: '2' 

services: 
    build_tools: 
    build: docker/gulp 
    volumes_from: 
     - build_data:rw 

    build_data: 
    image: debian:jessie 
    volumes: 
     - .:/usr/src/app 

So, jetzt der Behälter beginnt einen Bash-Skript, das kontinuierlich Schleife, bis es npm install in das Verzeichnis und laufen zu bekommen. Das ist immer noch ziemlich brüchig, aber es funktioniert. :)

+0

T H A N K Y O U für diese Antwort. Ich habe versucht, das gleiche Problem mit Webpack zu lösen. https://stackoverflow.com/questions/41058764/dockerized-django-with-webpackdevserver/41075389#41075389 – Pietro

+0

Sie Rock Holmes! süße Antwort –

11

Sie können während eines Docker-Builds keine Hostordner oder Volumes bereitstellen. Dadurch würde die Build-Wiederholbarkeit beeinträchtigt. Die einzige Möglichkeit, während eines Docker-Builds auf lokale Daten zuzugreifen, ist der Erstellungskontext, bei dem es sich um PATH oder URL handelt, den Sie an den Befehl build übergeben haben. Beachten Sie, dass die Dockerfile irgendwo im Kontext existieren muss. Weitere Informationen finden Sie unter https://docs.docker.com/engine/reference/commandline/build/.

+0

Um zu verdeutlichen, würde die Build Wiederholbarkeit^auf Remote-Docker-Hosts^durch die Referenz kompromittieren. Wenn Sie das nicht tun, sehe ich nicht, wie das Voranstellen referenzierter Dateien innerhalb des Docker-Build-Verzeichnisses Builds wiederholbarer macht, aber das bedeutet, dass Sie einen externen Build-Mechanismus benötigen. Selbst Docker-Compose kann das nicht, daher brauchst du noch eine andere Build-Stufe. Mehr Ebenen -> mehr Komplexität. Dumm. Wie auch immer, Sie können https: // github verwenden.com/CheggEng/dockerx, wenn Sie in der Lage sein möchten, Verzeichnisse zur Build-Zeit einzubinden, Build-Parameter vordefinieren und nicht eine Menge anderer Syntax in Docker einführen. –