Hier sind ein paar verschiedene Methoden...
A) Verwenden Sie docker exec (am einfachsten)
Docker-Version 1.3 oder neuer unterstützt den Befehl exec
die sich ähnlich verhalten wie nsenter
. Dieser Befehl kann einen neuen Prozess in einem bereits ausgeführten Container ausführen (Container muss PID 1-Prozess bereits ausgeführt haben). Sie können /bin/bash
ausführen zum Erkunden des Containerstatus:
docker exec -t -i mycontainer /bin/bash
siehe Docker-Befehlszeilendokumentation
B) Verwenden Sie Snapshots
Sie können das Container-Dateisystem folgendermaßen auswerten:
# find ID of your running container:
docker ps
# create image (snapshot) from container filesystem
docker commit 12345678904b5 mysnapshot
# explore this filesystem using bash (for example)
docker run -t -i mysnapshot /bin/bash
Auf diese Weise können Sie das Dateisystem des laufenden Containers zum genauen Zeitpunkt auswerten. Container wird noch ausgeführt, es sind keine zukünftigen Änderungen enthalten.
Sie können den Snapshot später löschen mit (Dateisystem des laufenden Containers ist nicht betroffen!):
docker rmi mysnapshot
C) Verwenden Sie ssh
Wenn Sie kontinuierlichen Zugriff benötigen, können Sie sshd in Ihrem Container installieren und den sshd-Daemon ausführen:
docker run -d -p 22 mysnapshot /usr/sbin/sshd -D
# you need to find out which port to connect:
docker ps
Auf diese Weise können Sie Ihre App mit ssh ausführen (verbinden und ausführen, was Sie wollen).
D) Verwenden Sie nsenter
Verwenden Sie nsenter
finden Sie unter Warum Sie SSHd nicht in Ihren Docker-Containern ausführen müssen
Die Kurzversion lautet:Mit nsenter können Sie eine Shell in einen vorhandenen Container holen, selbst wenn dieser Container kein SSH oder irgendeinen Spezial-Daemon ausführt
UPDATE:ERKUNDEN!
Mit diesem Befehl sollten Sie einen laufenden Docker-Container untersuchen können :
docker exec -it name-of-container bash
Das Äquivalent dafür in docker-compose wäre:
docker-compose exec web bash
(web ist in diesem Fall der Name des Dienstes und hat standardmäßig tty.)
Sobald Sie drinnen sind, tun Sie Folgendes:
ls -lsa
oder irgendein anderer Bash-Befehl wie:
cd ..
Mit diesem Befehl sollten Sie ein Docker-Image untersuchen können :
docker run --rm -it --entrypoint=/bin/bash name-of-image
Sobald Sie drinnen sind, tun Sie Folgendes:
ls -lsa
oder irgendein anderer Bash-Befehl wie:
cd ..
Die -it
steht für interaktiv... und tty.
Mit diesem Befehl sollten Sie einen laufenden Docker-Container oder ein Image untersuchen können :
docker inspect name-of-container-or-image
Vielleicht möchten Sie dies tun und herausfinden, ob bash
vorhanden ist oder sh
da drin. Suchen Sie in der json-Rückgabe nach dem Einstiegspunkt oder cmd.
HINWEIS: Diese Antwort hängt davon ab, ob das commen-Tool vorhanden ist, aber wenn kein bash
vorhanden ist Shell oder gängige Tools wie ls
vorhanden, könnten Sie zuerst einen in einer Ebene hinzufügen, wenn Sie Zugriff auf den Dockerfile
haben :Beispiel für Alpin:
RUN apk add --no-cache bash
Andernfalls, wenn Sie keinen Zugriff auf Dockerfile
haben Kopieren Sie dann einfach die Dateien aus einem neu erstellten Container und sehen Sie sie durch, indem Sie Folgendes tun:
docker create <image> # returns container ID the container is never started.
docker cp <container ID>:<source_path> <destination_path>
docker rm <container ID>
cd <destination_path> && ls -lsah
siehe Docker-Exec-Dokumentation
siehe docker-compose exec-Dokumentation
siehe docker inspect-Dokumentation
siehe docker create-Dokumentation
Falls Ihr Container gestoppt ist oder keine Shell hat (z.B. hello-world
in der Installationsanleitung erwähnt oder nicht-alpine
traefik
), ist dies wahrscheinlich die einzig mögliche Methode, das Dateisystem zu erkunden.
Sie können das Dateisystem Ihres Containers in eine Tar-Datei archivieren:
docker export adoring_kowalevski > contents.tar
Oder listen Sie die Dateien auf:
docker export adoring_kowalevski | tar t
Beachten Sie, dass dies je nach Image einige Zeit und Speicherplatz in Anspruch nehmen kann.