webentwicklung-frage-antwort-db.com.de

Warum hängt "Docker Attach"?

Ich kann einen ubuntu-Container erfolgreich ausführen: 

# docker run -it -d ubuntu
3aef6e642327ce7d19c7381eb145f3ad10291f1f2393af16a6327ee78d7c60bb
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3aef6e642327        ubuntu              "/bin/bash"         3 seconds ago       Up 2 seconds                            condescending_sammet

Aber docker attach wird ausgeführt: 

# docker attach 3aef6e642327

Bis ich eine beliebige Taste drücke, wie zum Beispiel Enter

# docker attach 3aef6e642327
[email protected]:/#
[email protected]:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

Warum hängt docker attach?

Update

Nachdem ich die Kommentare gelesen habe, bekomme ich die Antworten: 

voraussetzung: 

"docker attach" verwendet das gleiche tty, nicht das neue tty.  

(1) Ausführen des docker run ohne Dämonmodus: 

# docker run -it ubuntu
[email protected]:/# 

Alles ist in Ordnung, dann führen Sie den Befehl ls aus: 

[email protected]:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[email protected]:/#

(2) Führen Sie docker run im Daemon-Modus aus: 

# docker run -it -d ubuntu
91262536f7c9a3060641448120bda7af5ca812b0beb8f3c9fe72811a61db07fc

Eigentlich sollte Folgendes aus dem laufenden Container an stdout ausgegeben werden:  

[email protected]:/#

Das Ausführen von docker attach scheint zu hängen, aber es wartet auf Ihre Eingabe:

# docker attach 91262536f7c9
ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[email protected]:/#
44
Nan Xiao

Es ist nicht wirklich hängen. Wie Sie im folgenden Kommentar sehen können (Sie führen als Befehl "/bin/bash" aus), scheint das Verhalten beim Anhängen zu erwarten. 

Soweit ich weiß, dass Sie mit der laufenden Shell verbunden sind und nur stdin/stdout/stderr - abhängig von den Optionen, die Sie zusammen mit dem run-Befehl übergeben - zeigt Ihnen, was in diesem Moment in/ausgeht von diesem Moment. (Jemand mit etwas tiefer gehendem Wissen kann dies auf höherer Ebene erklären). 

Wie ich in meinem Kommentar zu Ihrer Frage schrieb, gibt es mehrere Leute, die ein Problem mit dem Dockith Github Repo aufgemacht haben, in dem ähnliches Verhalten beschrieben wird:

Da Sie von Shell sprechen, gehe ich davon aus, dass Sie bereits eine Shell ausführen. attach startet keinen neuen Prozess. Wie sieht das erwartete Verhalten der Verbindung zu den In/Out/Err-Streams eines laufenden Prozesses aus? Ich habe nicht darüber nachgedacht. Natürlich ist dies das erwartete Verhalten bei der Verbindung mit einer laufenden Shell, aber ist es wünschenswert?

Wäre es überhaupt möglich, stdout/stderr am Docker-Attach zu spülen, wodurch der Shell Prompt gedruckt werden muss, oder ist es etwas komplexer? Das würde ich persönlich erwarten, wenn ich mich an eine bereits laufende Shell anschließe.

Fühlen Sie sich frei, um dieses Problem zu schließen, falls nötig. Ich hatte das Bedürfnis, dies zu dokumentieren und Feedback zu erhalten.

  • Entnommen aus einem Kommentar zu dieser github Ausgabe . Weitere Informationen finden Sie in den Kommentaren dieser Ausgabe.

Wenn Sie statt enter mit der Eingabe eines Befehls beginnen würden, wird die leere Eingabeaufforderung extra _ nicht angezeigt. Wenn du laufen würdest

$ docker exec -it ubuntu <container-ID-or-name> bash 

wenn <container-ID-or-name> die ID oder der Name des Containers ist, nachdem Sie docker run -it -d ubuntu ausgeführt haben (also 3aef6e642327 oder condescending_sammet in Ihrer Frage), würde er einen new-Befehl ausführen, so dass dieses "stdout-Problem" nicht an ein vorhandenes angehängt wird .

Beispiel

Wenn Sie eine Dockerfile in einem Verzeichnis hätten, das Folgendes enthält:

FROM ubuntu:latest
ADD ./script.sh /timescript.sh 
RUN chmod +x /timescript.sh
CMD ["/timescript.sh"]

Und ein einfaches Bash-Skript script.sh im selben Verzeichnis mit:

#!/bin/bash

#trap ctrl-c and exit, couldn't get out
#of the docker container once attached
trap ctrl_c INT
function ctrl_c() {
    exit
}

while true; do
    time=$(date +%N)
    echo $time;
    sleep  1;
done

Dann bauen Sie (in diesem Beispiel im selben Verzeichnis wie Dockerfile und script.sh) und führen es mit aus

$ docker build -t nan-xiao/time-test .
..stuff happening...
$ docker run -itd --name time-test nan-xiao/time-test

Endlich attach

$ docker attach time-test

Sie werden an einen Container angehängt, der die Uhrzeit jede Sekunde ausgibt. (CTRL-C raus)

Beispiel 2

Oder wenn Sie eine Dockerfile hätten, die zum Beispiel Folgendes enthält:

FROM ubuntu:latest
RUN apt-get -y install irssi
ENTRYPOINT ["irssi"]

Führen Sie dann das gleiche Verzeichnis aus:

$ docker build -t nan-xiao/irssi-test .

Dann führe es aus:

$ docker run -itd --name irssi-test nan-xiao/irssi-test

Und schlussendlich

$ docker attach irssi-test

Sie würden ohne dieses Verhalten in einem laufenden irssi-Fenster enden. Natürlich können Sie irrsi für ein anderes Programm einsetzen.

Ich bin auch auf dieses Problem gestoßen, als ich versuchte, an einen Container anzuhängen, der von einer anderen Person entwickelt wurde, und bereits einen Dämon ausführt. (In diesem Fall war es das Docker-Image transmission von LinuxServer). 

Problem:

Was geschah, war das Terminal schien zu "hängen", wo das Tippen nichts half und nicht auftauchte. Nur Ctrl-C würde mich wieder rauswerfen. 

docker run, docker start, docker attach alles war nicht erfolgreich. Der Befehl, den ich benötigte (nachdem der Container mit run oder start gestartet wurde) war, bash auszuführen, da die Wahrscheinlichkeit groß ist, dass der Container, aus dem Sie gezogen haben, nicht läuft. 

Lösung:

docker exec -it <container-id> bash 

(Sie können den container-id finden, indem Sie docker ps -a ausführen).

Dies führt Sie in die Instanz mit einer funktionalen Bash als root (vorausgesetzt, das explizite Bild wurde nicht explizit eingerichtet).

Ich weiß, dass die akzeptierte Antwort dies auch erfasst hat, aber ich habe mich entschlossen, eine weitere zu posten, die etwas knapper und offensichtlicher ist, da die Lösung für mich beim Lesen nicht auftauchte.

12
matrixanomaly

Wenn ich docker attach container-name starte, ist nichts ausgegeben, selbst Ctrl-c ist ungültig. Also erstmal versuchen

docker attach container-name --sig-proxy=false

und dann kann ctrl-c es stoppen. Warum wurde nichts ausgegeben, weil der Container nicht ausgegeben wird. Eigentlich muss ich meinen Container eingeben und einen Shell-Befehl ausführen. Der richtige Befehl ist also 

docker exec -ti container-name bash
1
Billy Yang

Dies ist mir einmal aus folgendem Grund passiert:

Es kann sein, dass der Bash-Befehl im Container einen "Cat" -Befehl ausführt.

Wenn Sie also an den Container anhängen (den Bash-Befehl), befinden Sie sich tatsächlich innerhalb des Cat-Befehls, der eine Eingabe erwartet. (Text und/oder Strg-D, um die Datei zu schreiben)

1
HerbalMart

Ich hatte heute gerade ein ähnliches Problem und konnte es beheben:

Folgendes geschah für mich:

docker-compose logs -f nginx
Attaching to laradock_nginx_1

Dann würde es dort hängen bleiben, bis ich mit CTRL-C beendet wurde: ^CERROR: Aborting.

docker ps -a zeigte, dass das, was SHOULD laradock_nginx heißen sollte, nicht mit diesem Bildnamen vorhanden war. Ich dachte mir, ich würde diesen Container einfach entfernen und wieder "nach oben" stellen:

docker stop cce0c32f7556
docker rm cce0c32f7556
docker-compose up -d laradock_nginx

Leider: ERROR: No such service: laradock_nginx

Also habe ich einen Sudo reboot und dann docker ps -a gemacht, aber laradock_nginx war immer noch nicht da.

Glücklicherweise hat docker-compose up -d nginx dann funktioniert und docker-compose logs -f nginx funktioniert jetzt.

0
Ryan

Wenn Sie nicht auf die Befehlszeile zugreifen können, stellen Sie sicher, dass Sie Ihren Container beim Start mit dem Code -i ausführen.

0
Ali Motameni