Wie komme ich in die Shell eines Docker-Containers?

I'm immer begann die Arbeit mit Docker. I'm mit dem WordPress-Basis-Image und docker-compose.

Ich versuche, per SSH in einen der Container zu gelangen, um die Dateien/Verzeichnisse zu prüfen, die während des ersten Builds erstellt wurden. Ich habe versucht, docker-compose run containername ls -la auszuführen, aber das hat nichts gebracht. Selbst wenn es funktioniert, hätte ich lieber eine Konsole, in der ich die Verzeichnisstruktur durchsuchen kann, als einen einzigen Befehl auszuführen. Was ist der richtige Weg, um dies mit Docker zu tun?

Lösung

Mit docker attach können Sie sich mit Ihrem Docker-Container verbinden, aber das ist nicht wirklich dasselbe wie ssh. Wenn Ihr Container z.B. einen Webserver betreibt, wird docker attach Sie wahrscheinlich mit dem stdout des Webserverprozesses verbinden. Es wird Ihnen nicht unbedingt eine Shell geben.

Der Befehl docker exec ist wahrscheinlich das, wonach Sie suchen; damit können Sie beliebige Befehle innerhalb eines bestehenden Containers ausführen. Zum Beispiel:

docker exec -it  bash

Natürlich muss der Befehl, den Sie ausführen, im Dateisystem des Containers vorhanden sein.

In dem obigen Befehl ist `der Name oder die ID des Zielcontainers. Es spielt keine Rolle, ob Siedocker composeverwenden oder nicht; führen Sie einfachdocker ps` aus und verwenden Sie entweder die ID (eine hexadezimale Zeichenfolge, die in der ersten Spalte angezeigt wird) oder den Namen (der in der letzten Spalte angezeigt wird). Z.B.: gegeben:

$ docker ps
d2d4a89aaee9        larsks/mini-httpd   "mini_httpd -d /cont   7 days ago          Up 7 days                               web                 

kann ich ausführen:

$ docker exec -it web ip addr
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
18: eth0:  mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:3/64 scope link 
       valid_lft forever preferred_lft forever

Ich könnte das Gleiche erreichen, indem ich ausführe:

$ docker exec -it d2d4a89aaee9 ip addr

Auf ähnliche Weise könnte ich eine Shell im Container starten;

$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$
Kommentare (8)

docker exec" wird definitiv eine Lösung sein. Eine einfache Möglichkeit, mit der von Ihnen gestellten Frage zu arbeiten, ist das Mounten des Verzeichnisses innerhalb von Docker in das Verzeichnis des lokalen Systems.

So können Sie die Änderungen im lokalen Pfad sofort sehen.


docker run -v /Users/<path>:/
Kommentare (2)

Eine andere Möglichkeit ist die Verwendung von nsenter.

PID=$(docker inspect --format {{.State.Pid}} )
nsenter --target $PID --mount --uts --ipc --net --pid
Kommentare (4)