Как убить процесс внутри контейнера? Команда Docker top

у меня есть простой пример из официального руководства на сайте докер.

Я запускаю следующее:

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

а после выхода из созданного контейнера:

sudo docker logs a66
hello
hello
hello
...

затем я просматриваю запущенные процессы контейнера:

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

далее я пытаюсь убить первый процесс контейнера:

sudo docker exec a66 kill -9 25055

однако после того, как я это сделаю, ничего не изменится. Процесс все еще работает и выводит "hello" каждую секунду. Что я не так?

4 ответов


когда я воспроизвожу вашу ситуацию, я вижу разные PIDs между docker top <container> и docker exec -it <container> ps -aux. Когда вы делаете docker exec команда выполняется внутри контейнера => должен использовать PID контейнера. В противном случае вы могли бы убить без докера прямо из хоста, в вашем случае: sudo kill -9 25055.


проверить это:

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

чтобы понять это, начните с выполнения команд слева до конца каждого канала ( / )

более простой вариант:

kill $(pidof a66) 

потребовалось некоторое время, чтобы найти правильный ответ, но вам придется управлять этим процессом из контейнера. При запуске docker top a66 от хоста, PIDs от вашего хоста, хотя это не совсем так, если использовать Cygwin. Независимо от того, вам нужно будет bash или что у вас есть обратно в контейнер и использовать команды, такие как ps aux и kill в то время как в контейнере, чтобы найти и управлять различными PIDs для тех же процессов там.


Я искал что-то вроде этого, но я не мог найти, и тогда я сделал это:

[root@notebook ~]# docker exec-it tadeu_debian ps aux / grep ping | у awk '{ печати $2 }' | команды xargs -я{} докер экзек-я tadeu_debian командой kill -9

Это были два "execs" от Docker e one xargs.

ну, надеюсь, это кому-то поможет!