问题 CoreOS - 通过PID获取docker容器名称?


我有一个PID列表,我需要获取他们的docker容器名称。走向另一个方向很容易...通过图像名称获取docker容器的PID:

$ docker inspect --format '{{.State.Pid}}' {SOME DOCKER NAME}

知道如何通过PID获取名称吗?


10961
2018-06-25 10:55


起源



答案:


像这样的东西?

$ docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.ID}}' | grep "^${PID},"

[编辑]

放弃 这是针对“普通”的linux。我不知道有关CoreOS的任何有用信息,所以这可能会或可能不会在那里工作。


13
2018-06-25 12:18



其作品 ! (为什么我没想到greping输出:/) - Nimrod007
如果只需要docker名称可以添加| awk'{print $ 2}'到底:)谢谢 - Nimrod007
对于我当前的docker版本,我不得不将{{。ID}}更改为{{.Id}},似乎docker inspect输出略有变化! - David
是什么 ${PID} 在grep正则表达式吗?我只是尝试了这个,grep无法正常工作。 - wheeler


答案:


像这样的东西?

$ docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.ID}}' | grep "^${PID},"

[编辑]

放弃 这是针对“普通”的linux。我不知道有关CoreOS的任何有用信息,所以这可能会或可能不会在那里工作。


13
2018-06-25 12:18



其作品 ! (为什么我没想到greping输出:/) - Nimrod007
如果只需要docker名称可以添加| awk'{print $ 2}'到底:)谢谢 - Nimrod007
对于我当前的docker版本,我不得不将{{。ID}}更改为{{.Id}},似乎docker inspect输出略有变化! - David
是什么 ${PID} 在grep正则表达式吗?我只是尝试了这个,grep无法正常工作。 - wheeler


因为@Mitar的评论建议值得一个完整的答案:

要获取容器ID,您可以使用:

cat /proc/<process-pid>/cgroup

然后将容器ID转换为docker容器名称:

docker inspect --format '{{.Name}}' "${containerId}" | sed 's/^\///'

1
2017-11-27 23:14





我使用以下脚本来获取容器内进程的任何主机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"

0
2018-02-02 18:42



我明白了 error: list of process IDs must follow -p - servermanfail
您使用的是哪个版本的Docker? - Mitar
你也可以使用 cat /proc/<host pid>/cgroup 获取容器ID,然后使用 docker inspect --format '{{.Name}}' "$containerId" | sed 's/^\///' 从ID获取名称。 - Mitar
作为一个单行,使用@Mitar的想法: docker inspect --format '{{.Name}}' "$(cat /proc/$PID/cgroup |head -n 1 |cut -d / -f 3)" | sed 's/^\///' - Markus Kasten