it-swarm.com.de

Wie kann ich den Prozess im Container beenden? Docker-Oberbefehl

Ich habe ein einfaches Beispiel aus dem offiziellen Führer auf der Docker-Website.

Ich führe folgendes aus:

Sudo docker run -d ubuntu:latest /bin/sh -c "while true; do echo hello world; sleep 1; done"
a66asdasdhqie123...

Nehmen Sie dann etwas Ausgabe aus dem erstellten Container heraus:

Sudo docker logs a66
hello
hello
hello
...

Dann schaue ich die laufenden Prozesse eines Containers nach:

Sudo docker top a66
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                25055               15152               0                   20:07               ?                   00:00:00            /bin/sh -c while true; do echo hello world; sleep 1; done
root                25295               25055               0                   20:10               ?                   00:00:00            sleep 1

Als Nächstes versuche ich, den ersten Prozess des Containers zu beenden:

Sudo docker exec a66 kill -9 25055

Aber nachdem ich es gemacht habe, ändert sich nichts. Der Prozess funktioniert immer noch und gibt jede Sekunde "Hallo" aus. Was mache ich falsch?

11

Wenn ich Ihre Situation reproduziere, sehe ich unterschiedliche PIDs zwischen docker top <container> und docker exec -it <container> ps -aux. Wenn Sie docker exec ausführen, wird der Befehl im Container ausgeführt => sollte die PID des Containers verwenden. Andernfalls könnten Sie den Kill ohne Docker direkt vom Host aus durchführen, in Ihrem Fall: Sudo kill -9 25055.

13
Mykola Gurov

Überprüfen Sie dies:

ps | grep -i a66 | tr -s ' '|cut -f2 -d' '|
{
    while read line;
    do kill -9 $line;
    done
}

um dies zu verstehen, beginnen Sie mit der Ausführung von Befehlen von links bis zum Ende jeder Pipe (|).

Einfachere Option:

kill $(pidof a66) 

ich suchte nach etwas wie diesem, konnte es aber nicht finden und tat es dann:

[root @ notebook ~] # docker exec -it tadeu_debian ps aux | grep ping | awk '{print $ 2}' | xargs -I {} docker exec -i tadeu_debian kill -9

Es waren zwei "Execs" von Docker und One Xargs.

Ich hoffe, das hilft jemandem! 

0
Tadeu Bernacchi

Ich habe eine Weile gebraucht, um die richtige Antwort zu finden, aber Sie müssen diesen Prozess aus dem Container heraus verwalten. Wenn Sie docker top a66 vom Host aus ausführen, stammen die PIDs von Ihrem Host, obwohl dies bei Verwendung von Cygwin nicht ganz der Fall ist. Unabhängig davon müssen Sie bash oder was Sie haben in Ihren Container zurückkehren und Befehle wie ps aux und kill verwenden, während Sie sich im Container befinden, um die verschiedenen PIDs für dieselben Prozesse dort zu finden und zu verwalten.

0