Einführung
Docker ist ein Containerisierungstool, das Entwicklern hilft, portable, Linux-kompatible Container zu erstellen und zu verwalten.
Bei der Entwicklung oder Bereitstellung von Containern ist es oft notwendig, in einen laufenden Container hineinzusehen, um dessen aktuellen Zustand zu überprüfen oder ein Problem zu beheben. Zu diesem Zweck stellt Docker den Befehl `docker exec` zur Verfügung, um Anwendungen in laufenden Containern auszuführen.
In diesem Tutorial lernen wir den Befehl docker exec kennen und wie man ihn verwendet, um Befehle auszuführen und eine interaktive Shell in einem Docker-Container zu erhalten.
Voraussetzungen
Dieses Tutorial setzt voraus, dass Docker bereits installiert ist und Ihr Benutzer die Berechtigung hat, Docker auszuführen. Falls Sie Docker als Root-Benutzer ausführen müssen, denken Sie bitte daran, den Befehlen in diesem Tutorial `sudo` hinzuzufügen.
Weitere Informationen zur Verwendung von Docker ohne sudo-Zugriff finden Sie im Abschnitt „Ausführen eines Docker-Befehls ohne sudo“ in unserem Tutorial „So installieren Sie Docker“.
Starten eines Testcontainers
Um den Befehl `docker exec` zu verwenden, benötigen Sie einen laufenden Docker-Container. Falls Sie noch keinen haben, starten Sie einen Testcontainer mit dem folgenden `docker exec`-Befehl:
docker run -d --name container-name alpine watch "date >> /var/log/date.log"
Dieser Befehl erstellt einen neuen Docker-Container aus dem offiziellen Alpine-Image. Alpine ist ein beliebtes Linux-Container-Image, das auf Alpine Linux basiert, einer schlanken und minimalistischen Linux-Distribution.
Mit dem Parameter `-d` wird der Container vom Terminal getrennt und im Hintergrund ausgeführt. `--name Containername` gibt dem Container einen Namen. Sie können hier einen beliebigen Namen wählen oder diesen Parameter weglassen, damit Docker automatisch einen eindeutigen Namen für den neuen Container generiert.
Als nächstes haben wir Alpine, das das Image festlegt, das wir für den Container verwenden möchten.
Und schließlich haben wir “date >> /var/log/date.log”. Dies ist der Befehl, den wir im Container ausführen möchten. Standardmäßig führt die Uhr den angegebenen Befehl alle zwei Sekunden aus. In diesem Fall lautet der Befehl „date >> /var/log/date.log“. „date“ gibt das aktuelle Datum und die aktuelle Uhrzeit aus, etwa so:
Output
Fri Jul 23 14:57:05 UTC 2021Der Abschnitt >> /var/log/date.log leitet die Ausgabe des Befehls date um und hängt sie an die Datei /var/log/date.log an. Alle zwei Sekunden wird eine neue Zeile angehängt, und nach einigen Sekunden sieht die Datei etwa so aus:
Output
Fri Jul 23 15:00:26 UTC 2021
Fri Jul 23 15:00:28 UTC 2021
Fri Jul 23 15:00:30 UTC 2021
Fri Jul 23 15:00:32 UTC 2021
Fri Jul 23 15:00:34 UTC 2021Als Nächstes lernen wir, wie man die Namen von Docker-Containern ermittelt. Dies ist hilfreich, wenn Sie bereits einen Container haben, den Sie ansprechen möchten, aber nicht sicher sind, wie er heißt.
Den Namen des Docker-Containers ermitteln
Wir müssen docker exec den Namen (oder die Container-ID) des Containers mitteilen, mit dem wir arbeiten möchten. Diese Information finden wir mit dem Befehl docker ps:
docker ps
Dieser Befehl listet alle auf dem Server laufenden Docker-Container auf und liefert einige allgemeine Informationen darüber:
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
76aded7112d4 alpine "watch 'date >> /var…" 11 seconds ago Up 10 seconds container-nameIn diesem Beispiel sind die Container-ID und der Name hervorgehoben. Sie können eine der beiden Angaben verwenden, um docker exec mitzuteilen, welcher Container verwendet werden soll.
Wenn Sie den Namen Ihres Containers ändern möchten, verwenden Sie den Befehl docker rename:
docker rename container-name new-name
Als Nächstes werden wir einige Beispiele für die Verwendung von docker exec zum Ausführen von Befehlen in einem Docker-Container durchgehen.
Ausführen einer interaktiven Shell in einem Docker-Container
Wenn Sie eine interaktive Shell innerhalb eines Docker-Containers starten müssen, beispielsweise um das Dateisystem zu erkunden oder laufende Prozesse zu debuggen, verwenden Sie docker exec mit den Flags -i und -t.
Die Option `-i` hält die Eingabe zum Container offen, und die Option `-t` erzeugt ein Pseudo-Terminal, mit dem die Shell eine Verbindung herstellen kann. Diese Optionen können wie folgt kombiniert werden:
docker exec -it container-name sh
Dadurch wird die Shell im angegebenen Container gestartet und Ihnen eine erste Eingabeaufforderung angezeigt. Um den Container zu verlassen, geben Sie „exit“ ein. EINGEBEN Drücken:
exitFalls Ihr Container-Image eine fortgeschrittenere Shell wie bash enthält, können Sie sh oben durch bash ersetzen.
Ausführen eines nicht-interaktiven Befehls in einem Docker-Container
Wenn Sie einen Befehl innerhalb eines laufenden Containers ausführen müssen, aber nicht interagieren müssen, verwenden Sie den Befehl docker exec ohne jegliche Flags:
docker exec container-name tail /var/log/date.log
Dieser Befehl führt `tail /var/log/date.log` für den Container mit dem Namen `container` aus und gibt die Ergebnisse aus. Standardmäßig gibt der Befehl `tail` die letzten zehn Zeilen einer Datei aus. Wenn Sie den im ersten Abschnitt eingerichteten Testcontainer ausführen, sehen Sie etwa Folgendes:
Output
Mon Jul 26 14:39:33 UTC 2021
Mon Jul 26 14:39:35 UTC 2021
Mon Jul 26 14:39:37 UTC 2021
Mon Jul 26 14:39:39 UTC 2021
Mon Jul 26 14:39:41 UTC 2021
Mon Jul 26 14:39:43 UTC 2021
Mon Jul 26 14:39:45 UTC 2021
Mon Jul 26 14:39:47 UTC 2021
Mon Jul 26 14:39:49 UTC 2021
Mon Jul 26 14:39:51 UTC 2021Dies entspricht im Wesentlichen dem Öffnen einer interaktiven Shell für den Docker-Container (wie im vorherigen Schritt mit `docker exec -it container-name sh`) und dem anschließenden Ausführen des Befehls `tail /var/log/date.log`. Anstatt jedoch eine Shell zu öffnen, den Befehl auszuführen und die Shell anschließend zu schließen, liefert dieser Befehl dieselbe Ausgabe in einem einzigen Befehl, ohne ein Pseudo-Terminal zu öffnen.
Ausführen von Befehlen in einem alternativen Verzeichnis in einem Docker-Container
Um einen Befehl in einem bestimmten Verzeichnis Ihres Containers auszuführen, verwenden Sie den Parameter –workdir, um das Verzeichnis anzugeben:
docker exec --workdir /tmp container-name pwd
Dieser Beispielbefehl legt das Verzeichnis /tmp als Arbeitsverzeichnis fest und führt anschließend den Befehl pwd aus, der das aktuelle Arbeitsverzeichnis ausgibt:
Output
/tmp
Der Befehl pwd hat bestätigt, dass das Arbeitsverzeichnis /tmp ist.
Ausführen von Befehlen als anderer Benutzer in einem Docker-Container
Um einen Befehl als anderer Benutzer innerhalb Ihres Containers auszuführen, fügen Sie das Flag --user hinzu:
docker exec --user guest container-name whoami
Hierbei wird der Gastbenutzer verwendet, um den Befehl `whoami` im Container auszuführen. Der Befehl `whoami` gibt den aktuellen Benutzernamen des Benutzers aus:
Output
guestDer Befehl whoami bestätigt, dass der aktuelle Benutzer des Containers der Gast ist.
Übergeben von Umgebungsvariablen an einen Docker-Container
Manchmal ist es notwendig, Umgebungsvariablen zusammen mit dem Befehl `run` an einen Container zu übergeben. Mit dem Flag `-e` können Sie eine Umgebungsvariable angeben:
docker exec -e TEST=sammy container-name env
Dieser Befehl setzt die Umgebungsvariable TEST auf sammy und führt anschließend den Befehl env innerhalb des Containers aus. Der Befehl env gibt dann alle Umgebungsvariablen aus:
Output
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=76aded7112d4
TEST=sammy
HOME=/rootDie Variable TEST ist auf sammy gesetzt.
Um mehrere Variablen festzulegen, wiederholen Sie den Parameter -e für jede Variable:
docker exec -e TEST=sammy -e ENVIRONMENT=prod container-name env
Wenn Sie eine Datei mit Umgebungsvariablen übergeben möchten, können Sie dies mit dem Parameter –env-file tun.
Erstellen Sie zunächst die Datei mit einem Texteditor. Wir öffnen hier eine neue Datei mit nano, Sie können aber jeden beliebigen Editor verwenden, mit dem Sie vertraut sind:
nano .env
Wir verwenden .env als Dateinamen, weil dies ein gängiger Standard für die Verwendung solcher Dateien zur Verwaltung von Informationen außerhalb der Versionskontrolle ist.
Schreiben Sie Ihre KEY=value-Variablen in die Datei, eine pro Zeile, wie unten gezeigt:
TEST=sammy
ENVIRONMENT=prodDatei speichern und schließen. Um die Datei zu speichern und nano zu beenden, drücken Sie STRG+O, dann die Eingabetaste zum Speichern und anschließend STRG+X zum Beenden.
Führen Sie nun den Befehl docker exec aus und geben Sie nach --env-file den korrekten Dateinamen an:
docker exec --env-file .env container-name env
Output
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=76aded7112d4
TEST=sammy
ENVIRONMENT=prod
HOME=/rootIn der Datei sind zwei Variablen festgelegt.
Sie können mehrere Dateien mithilfe mehrerer `--env-file`-Flags angeben. Falls sich die Variablen in den Dateien überschneiden, überschreibt die im letzten Befehl angegebene Datei die vorherigen Dateien.
Häufige Fehler
Bei der Verwendung des Befehls docker exec können einige häufige Fehler auftreten:
Error: No such container: container-name
Die Fehlermeldung „Kein solcher Container“ bedeutet, dass der angegebene Container nicht existiert und möglicherweise ein Tippfehler im Containernamen vorliegt. Verwenden Sie `docker ps`, um Ihre laufenden Container aufzulisten und den Namen zu überprüfen.
Error response from daemon: Container 2a94aae70ea5dc92a12e30b13d0613dd6ca5919174d73e62e29cb0f79db6e4ab is not running
Diese Meldung bedeutet, dass der Container zwar existiert, aber gestoppt ist. Sie können den Container mit dem Befehl `docker start container-name` starten.
Error response from daemon: Container container-name is paused, unpause the container before exec
Die Fehlermeldung „Container ist pausiert“ beschreibt das Problem gut. Bevor Sie fortfahren, müssen Sie den Container mit dem Befehl „docker unpause container-name“ wieder aktivieren.
Ergebnis
In diesem Tutorial haben wir gelernt, wie man Befehle in einem laufenden Docker-Container ausführt, sowie einige Befehlszeilenoptionen, die dabei verwendet werden.
Weitere Informationen zu Docker im Allgemeinen finden Sie auf unserer Docker-Tag-Seite. Dort finden Sie Links zu Docker-Tutorials, Docker-bezogenen FAQ-Seiten und mehr.









