如何使用 cgroup v2 从容器内获取 docker 容器 ID

jan*_*-di 7 linux cgroups docker

由于 Docker 自引擎版本 20.10 起支持 cgroup v2,它将自动在启用了 cgroups v2 的发行版上使用它。从容器内获取唯一容器 ID 的已知解决方案不再有效。

/ # cat /proc/self/cgroup
0::/

/ # cat /proc/1/cpuset
/
Run Code Online (Sandbox Code Playgroud)

在 Debian 11 上使用 alpine:latest 尝试使用 docker v20.10.8。

cgroup v1 的工作解决方案: 如何从容器本身获取 Docker Linux 容器信息?

正如 docker 参考中所述,使用 cgroup v2,容器 id 在文件系统中的以下位置仍然可见,但无法从容器本身访问这些位置。

/sys/fs/cgroup/memory/docker/<longid>/ on cgroup v1, cgroupfs driver
/sys/fs/cgroup/memory/system.slice/docker-<longid>.scope/ on cgroup v1, systemd driver
/sys/fs/cgroup/docker/<longid/> on cgroup v2, cgroupfs driver
/sys/fs/cgroup/system.slice/docker-<longid>.scope/ on cgroup v2, systemd driver
Run Code Online (Sandbox Code Playgroud)

https://docs.docker.com/config/containers/runmetrics/#find-the-cgroup-for-a-given-container

编辑 1/2021-09-01:

一种解决方法是使用选项运行容器--cgroupns host。但这需要控制容器的创建。

/ # cat /proc/self/cgroup
0::/

/ # cat /proc/1/cpuset
/
Run Code Online (Sandbox Code Playgroud)

题:

有什么办法可以从内部获取唯一的容器 ID?(不依赖容器主机名或必须使用 docker api 来获取 id)

Ric*_*rdH 12

--cgroupns host修复有效,但如果您不控制容器的创建,则该修复不可用。此外,此docker run选项在 API 或 docker compose ( https://github.com/compose-spec/compose-spec/issues/148 ) 中不可用。

\n

但是...好消息 - 容器 ID 仍然通过 /proc/self/mountinfo 公开:

\n
678 655 254:1 /docker/containers/7a0144cee1256c539fab790199527b7051aff1b603ebcf7ed3fd436440ef3b3a/resolv.conf /etc/resolv.conf rw,relatime - ext4 /dev/vda1 rw\n679 655 254:1 /docker/containers/7a0144cee1256c539fab790199527b7051aff1b603ebcf7ed3fd436440ef3b3a/hostname /etc/hostname rw,relatime - ext4 /dev/vda1 rw\n680 655 254:1 /docker/containers/7a0144cee1256c539fab790199527b7051aff1b603ebcf7ed3fd436440ef3b3a/hosts /etc/hosts rw,relatime - ext4 /dev/vda1 rw\n
Run Code Online (Sandbox Code Playgroud)\n

这是一个将解析它的 Python 代码片段:\xef\xbb\xbf\xef\xbb\xbf\xef\xbb\xbf

\n
with open( \'/proc/self/mountinfo\' ) as file:\n    line = file.readline().strip()    \n    while line:\n        if \'/docker/containers/\' in line:\n            containerID = line.split(\'/docker/containers/\')[-1]     # Take only text to the right\n            containerID = containerID.split(\'/\')[0]                 # Take only text to the left\n            break\n        line = file.readline().strip()\n
Run Code Online (Sandbox Code Playgroud)\n

归功于richgriswold:https://community.toradex.com/t/python-nullresource-error-when-running-torizo ​​ncore-builder-build/15240/4

\n