Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux CoreOS-通过PID获取docker容器名称?_Linux_Bash_Docker_Coreos_Nsenter - Fatal编程技术网

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

Linux CoreOS-通过PID获取docker容器名称?,linux,bash,docker,coreos,nsenter,Linux,Bash,Docker,Coreos,Nsenter,我有一个PID的列表,我需要得到他们的docker容器名称。往另一个方向走很容易。。。按图像名称获取docker容器的PID: $ docker inspect --format '{{.State.Pid}}' {SOME DOCKER NAME} 知道如何通过PID来获取名称吗?类似这样的东西 $ docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.ID}}' | grep "^${PID}," [编辑] 免责

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

$ docker inspect --format '{{.State.Pid}}' {SOME DOCKER NAME}
知道如何通过PID来获取名称吗?

类似这样的东西

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

免责声明这是针对“普通”linux的。我不知道关于CoreOS的任何有用的东西,所以这可能在那里起作用,也可能不起作用


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

因为@Mitar的评论建议应该是一个完整的答案:

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

cat /proc/<process-pid>/cgroup

。。。作为一个单一的班轮


PID=20168;sudo docker ps--no trunc | grep$(cat/proc/$PID/cgroup | grep-oE'[0-9a-f]{64}head-1)| sed's/^.*/'

如果只需要docker name就可以在最后添加| awk'{print$2}感谢我当前的docker版本,我不得不将{.ID}改为{.ID},似乎docker inspect的输出略有改变!grep正则表达式中的
${PID}
是什么?我刚试过这个,但grep不起作用。@wheeler,这是你要找的PID。例如,如果要查找PID 123,则可以在运行上述命令之前导出PID=123。或者您可以将
${PID}
替换为
123
。您使用的是哪个版本的Docker?您还可以使用
cat/proc//cgroup
获取容器ID,然后使用
Docker inspect--format'{.Name}'$containerId“| sed's/^\/'
从ID获取名称。作为一行,使用@Mitar的想法:
docker inspect--format'{.Name}'$(cat/proc/$PID/cgroup | head-n1 | cut-d/-f3)“| sed's/^\/'
或更短的PID=20168;sudo docker ps——没有trunc | grep$(grep-oE'[0-9a-f]{64}'/proc/$PID/cgroup | head-1)| sed's/^.*/'甚至更快:)sudo docker ps——没有trunc | grep$(head-1/proc/$PID/cgroup | grep-oE'[0-9a-f]{64})| sed的/^.*/'一点解释:--no trunc在64位哈希中显示容器id,该哈希仅包含从“a”到“f”grep-oE“[0-9a-f]{64}”greps的数字和字符,完全对应于64位哈希,并仅打印哈希。请不要将其他信息作为注释包含到您的答案中。相反,请在您的答案中包含此信息,使用。
docker inspect --format '{{.Name}}' "${containerId}" | sed 's/^\///'