2013-12-17 14 views
82

In Docker Ich möchte, dies zu tun:Docker: Verzeichnis wechseln Befehl

git clone XYZ 
cd XYZ 
make XYZ 

jedoch, weil es keinen Befehl cd ist, ich habe in den vollständigen Pfad jedes Mal passieren (machen XYZ/fullpath). Irgendwelche guten Lösungen dafür?

+0

verwandte: http://stackoverflow.com/questions/17891669/docker-command-fails-during-build-but-succeeds-while-executed-within-running-co – trcarden

+2

WORKDIR Befehl als eine mögliche Problemumgehung als auch notiert – trcarden

+0

Keine Workaround, es ist die empfohlene Lösung https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#workdir –

Antwort

54

Sie können ein Skript oder einen komplexeren Parameter im RUN ausführen. Hier ist ein Beispiel von einem Dockerfile ich heruntergeladen habe auf vorher aussehen:

RUN cd /opt && unzip treeio.zip && mv treeio-master treeio && \ 
    rm -f treeio.zip && cd treeio && pip install -r requirements.pip 

Wegen der Verwendung von ‚& &‘, es nur auf die endgültige bekommen ‚installieren pip‘ Befehl, wenn alle vorherigen Befehle hat bestanden.

Da jeder RUN einen neuen COMMIT & (derzeit) einen AUFS-Layer erstellt, werden Sie die Grenzen ausnutzen, wenn Sie zu viele Befehle in der Dockerfile haben, also die RUNs zusammenführen (wenn die Datei stabil ist) kann sehr nützlich sein.

+6

Falls Sie sich wundern, der Effekt der 'cd' dauert nur für den aktuellen' RUN'-Befehl. Der nächste "RUN" startet vom aktuellen "WORKDIR". – Ritchie

234

Um in ein anderes Verzeichnis zu wechseln, verwenden Sie WORKDIR. Alle Befehle RUN, CMD und ENTRYPOINT nach WORKDIR werden aus diesem Verzeichnis ausgeführt.

RUN git clone XYZ 
WORKDIR "/XYZ" 
RUN make 
+12

Die Verwendung von WORKDIR wird auch als eine [dockerfile best practice] zitiert (https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#workdir) –

+2

Ich glaube, das ist eine angemessenere Antwort auf die Frage – purpletentacle

Verwandte Themen