CoreOS - получить имя контейнера докера по PID?
У меня есть список PID, и мне нужно получить их имя контейнера докера. Идти в другом направлении легко... получите PID контейнера Docker по имени изображения:
$ docker inspect --format '{{.State.Pid}}' {SOME DOCKER NAME}
Есть идеи, как получить имя по PID?
4 ответа
Что-то вроде этого?
$ docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.ID}}' | grep "^${PID},"
[РЕДАКТИРОВАТЬ]
Отказ от ответственности Это для "нормального" Linux. Я не знаю ничего полезного о CoreOS, так что это может или не может работать там.
Потому что комментарий @Mitar заслуживает того, чтобы быть полным ответом:
Чтобы получить идентификатор контейнера, вы можете использовать:
cat /proc/<process-pid>/cgroup
Затем преобразовать идентификатор контейнера в имя контейнера Docker:
docker inspect --format '{{.Name}}' "${containerId}" | sed 's/^\///'
... также как однострочный
PID=20168; sudo docker ps --no-trunc | grep $(cat /proc/$PID/cgroup | grep -oE '[0-9a-f]{64}' | head -1) | sed 's/^.* //'
Я использую следующий скрипт, чтобы получить имя контейнера для любого PID узла процесса внутри контейнера:
#!/bin/bash -e
# Prints the name of the container inside which the process with a PID on the host is.
function getName {
local pid="$1"
if [[ -z "$pid" ]]; then
echo "Missing host PID argument."
exit 1
fi
if [ "$pid" -eq "1" ]; then
echo "Unable to resolve host PID to a container name."
exit 2
fi
# ps returns values potentially padded with spaces, so we pass them as they are without quoting.
local parentPid="$(ps -o ppid= -p $pid)"
local containerId="$(ps -o args= -f -p $parentPid | grep docker-containerd-shim | cut -d ' ' -f 2)"
if [[ -n "$containerId" ]]; then
local containerName="$(docker inspect --format '{{.Name}}' "$containerId" | sed 's/^\///')"
if [[ -n "$containerName" ]]; then
echo "$containerName"
else
echo "$containerId"
fi
else
getName "$parentPid"
fi
}
getName "$1"