由于Docker从引擎20.10版本开始支持cgroup v2,它将自动在启用了cgroup v2的发行版上使用它。已知的从容器内获取唯一的容器ID的解决方案不再起作用了。
/ # cat /proc/self/cgroup
/ # cat /proc/1/cpuset
在Debian 11上尝试使用docker v20.10.8和alpine:fresh。
Working solutions for 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
https://docs.docker.com/config/containers/runmetrics/#find-the-cgroup-for-a-given-container
Edit 1/2021-09-01:
一个解决方法是用选项--cgroupns host
来运行容器。但这需要对容器的创建进行控制。
$ docker run -it --cgroupns host alpine cat /proc/self/cgroup
0::/system.slice/docker-09ec67119d38768dbf7994d81c325e2267214428a3c2e581c81557e3650863d8.scope
$ docker run -it alpine cat /proc/self/cgroup
Question:
有什么办法可以从内部获得唯一的容器ID吗?(不需要依赖容器的主机名或者使用docker api来获取id)