HOWTO · Docker

Befehl zum Ändern des Arbeitsverzeichnisses in Docker

In diesem Artikel werden Methoden zum Ändern des Arbeitsverzeichnisses in Docker erläutert.

Auf dieser Seite

Verwenden Sie WORKDIR in einer Dockerfile, um das Verzeichnis für nachfolgende Build-Anweisungen und als Standardarbeitsverzeichnis des Images festzulegen. Mit docker run -w /app wählen Sie das Verzeichnis für den Prozess eines neu gestarteten Containers; mit docker exec -w /app legen Sie es für einen Befehl fest, der in einem laufenden Container gestartet wird. Für die interaktive Navigation starten Sie mit docker exec eine Shell und führen dort cd aus. Diese Optionen gelten für unterschiedliche Phasen und Bereiche: Eine Änderung für einen Prozess oder eine Shell wirkt sich nicht auf alle Prozesse im Container aus.

Docker-Arbeitsverzeichnisse verstehen

Ein Arbeitsverzeichnis ist der Ausgangspunkt für relative Pfade, die ein Prozess verwendet. Ein Image kann ein eigenes Arbeitsverzeichnis festlegen. Gehen Sie daher nicht davon aus, dass ein Container in / startet. WORKDIR legt ein Verzeichnis in der Image-Konfiguration fest und gilt außerdem für nachfolgende Dockerfile-Anweisungen. Zur Laufzeit kann docker run -w für diesen Aufruf ein anderes Verzeichnis auswählen. docker exec -w legt das Verzeichnis für einen neu gestarteten Befehl in einem vorhandenen Container fest.

Wählen Sie die Methode danach aus, wann das Verzeichnis gelten soll: beim Erstellen eines Images, beim Starten eines Containers oder für einen später gestarteten Befehl beziehungsweise eine Shell. cd in einer Shell ändert nur das aktuelle Verzeichnis dieser Shell. Es ändert weder das Arbeitsverzeichnis anderer Prozesse noch einen containerweiten Zustand.

Das Arbeitsverzeichnis in einer Dockerfile festlegen

Schreiben Sie in einer Dockerfile WORKDIR /app vor die Anweisungen, die /app verwenden sollen. Eine Abfolge von Anweisungen kann beispielsweise aus FROM ubuntu:24.04, WORKDIR /app, COPY . . und RUN make bestehen. Das ist die Syntax einer Dockerfile und kein Shell-Skript. Die späteren Anweisungen COPY und RUN verwenden /app als Arbeitsverzeichnis. Falls der Pfad noch nicht existiert, erstellt Docker ihn. Eine spätere WORKDIR-Anweisung ändert das Verzeichnis für die darauffolgenden Anweisungen.

RUN führt einen Befehl während des Image-Builds aus; die Anweisung dient nicht dazu, das Arbeitsverzeichnis dauerhaft festzulegen. Beispielsweise ändert RUN cd /app das Verzeichnis nur in der Shell, die für diese RUN-Anweisung verwendet wird. Eine folgende RUN-Anweisung startet eine eigene Shell und übernimmt das Verzeichnis dieser Shell nicht. Wenn mehrere Befehle innerhalb einer Anweisung dieselbe Verzeichnisänderung verwenden sollen, führt RUN cd /app && make beide in derselben Shell aus; make wird ausgeführt, nachdem cd erfolgreich war. Verwenden Sie vorzugsweise WORKDIR /app, wenn nachfolgende Dockerfile-Anweisungen dieses Verzeichnis nutzen sollen.

Ein Arbeitsverzeichnis beim Starten eines Containers auswählen

Verwenden Sie -w (oder --workdir) mit docker run, um das Verzeichnis für den anfänglichen Prozess des Containers festzulegen. Die Syntax docker run --rm -w /app alpine:3.20 pwd startet beispielsweise einen Prozess in /app und lässt ihn sein Arbeitsverzeichnis ausgeben. Der Image-Name ist alpine:3.20; pwd ist der im Container ausgeführte Befehl. Docker erstellt das ausgewählte Verzeichnis im Container, falls es noch nicht existiert. Diese Option gilt für diesen Container-Aufruf; sie ändert weder die Dockerfile noch erstellt sie das Image neu.

Der obige Befehl ist ein veranschaulichendes Docker-Beispiel. In diesem Paket liegen keine Ausführungsnachweise dafür vor. Führen Sie ihn auf einem Host mit Docker-Zugriff aus, um das Ergebnis zu sehen. Ein Bind-Mount ist nur nötig, wenn der Prozess auf Dateien des Hosts zugreifen muss; allein zum Auswählen eines Arbeitsverzeichnisses wird er nicht benötigt. Wenn Sie Dateien einbinden, geben Sie den Host-Pfad und den Container-Pfad getrennt an und achten Sie darauf, dass der Container-Pfad mit -w ausgewählt wird.

Das Verzeichnis in einem laufenden Container wechseln

Für einen einzelnen Befehl in einem vorhandenen Container verwenden Sie docker exec -w /app my_container pwd. Ersetzen Sie my_container durch den Namen oder die ID des Containers und /app durch den gewünschten Pfad. Die Option -w gilt für diesen pwd-Prozess; sie ändert weder das Verzeichnis des Hauptprozesses des Containers noch das anderer Befehle.

Für eine interaktive Shell starten Sie sie mit docker exec -it my_container sh und geben anschließend an der Eingabeaufforderung cd /app ein. Ersetzen Sie sh nur dann durch bash, wenn das Image Bash enthält. Die Verzeichnisänderung gilt für die Dauer dieser Shell-Sitzung. Sie bleibt nach dem Beenden der Shell nicht bestehen und wirkt sich nicht auf andere Prozesse im Container aus. Diese Befehle setzen einen bereits laufenden Container voraus und verwenden Docker-spezifische Syntax; ein Docker-Ausführungsergebnis liegt hier nicht vor.

Das folgende Beispiel veranschaulicht lokal, wie cd das aktuelle Shell-Verzeichnis ändert. Es wurde im bereitgestellten Paket nicht ausgeführt und benötigt Docker nicht:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

cd /tmp && printf 'Current directory: ' && pwd

Das Beispiel wird in der Shell ausgeführt, in die Sie es eingeben; es startet oder ändert keinen Docker-Container. Derselbe Unterschied im Geltungsbereich erklärt, warum cd in einer interaktiven Container-Shell nur diese Shell betrifft.

Verwenden Sie WORKDIR für das Build-Verzeichnis und das Standardverzeichnis eines Images, docker run -w für den anfänglichen Prozess eines neuen Containers und docker exec -w oder eine interaktive Shell für Arbeiten, die in einem laufenden Container gestartet werden. Prüfen Sie in jedem Fall, welcher Prozess oder welche Anweisung das ausgewählte Verzeichnis verwendet, bevor Sie sich auf relative Pfade verlassen.