在 Docker 容器中访问完整的 /proc

Phi*_*ler 8 linux docker

默认情况下,Docker 通过在容器上/proc挂载一些东西来隐藏容器的几个文件和目录:

$ docker run ubuntu:bionic findmnt -R /proc
TARGET                SOURCE              FSTYPE OPTIONS
/proc                 proc                proc   rw,nosuid,nodev,noexec,relatime
|-/proc/bus           proc[/bus]          proc   ro,relatime
|-/proc/fs            proc[/fs]           proc   ro,relatime
|-/proc/irq           proc[/irq]          proc   ro,relatime
|-/proc/sys           proc[/sys]          proc   ro,relatime
|-/proc/sysrq-trigger proc[/sysrq-trigger]
|                                         proc   ro,relatime
|-/proc/asound        tmpfs               tmpfs  ro,relatime
|-/proc/acpi          tmpfs               tmpfs  ro,relatime
|-/proc/kcore         tmpfs[/null]        tmpfs  rw,nosuid,size=65536k,mode=755
|-/proc/keys          tmpfs[/null]        tmpfs  rw,nosuid,size=65536k,mode=755
|-/proc/timer_list    tmpfs[/null]        tmpfs  rw,nosuid,size=65536k,mode=755
|-/proc/sched_debug   tmpfs[/null]        tmpfs  rw,nosuid,size=65536k,mode=755
`-/proc/scsi          tmpfs               tmpfs  ro,relatime
Run Code Online (Sandbox Code Playgroud)

如何在 Docker(当前使用版本 18.09)中禁用此行为?我需要访问一个proc没有任何挂载的实例,否则嵌套容器(例如, with unshare)会因为内核保护启动而失败。可以使用以下命令看到这一点:

docker run -it --security-opt="seccomp=unconfined" --cap-drop=all ubuntu:bionic unshare --fork --user --pid --mount --mount-proc --setgroups deny --map-root-user --propagation unchanged /bin/bash
Run Code Online (Sandbox Code Playgroud)

这会失败,unshare: mount /proc failed: Permission denied因为挂载在 之上/proc,如果 Docker 不创建这些挂载,它将起作用。

我知道这--privileged提供了对以下内容的完全访问权限/proc

$ docker run --privileged ubuntu:bionic findmnt -R /proc
TARGET SOURCE FSTYPE OPTIONS
/proc  proc   proc   rw,nosuid,nodev,noexec,relatime
Run Code Online (Sandbox Code Playgroud)

但是,--privileged给容器更多的权限(功能、设备访问等),我不想要这个。我只需要完全访问/proc.

proc如果其中一个安装没有重叠安装,我也可以在容器中安装两次文件系统。不幸的是,使用在容器中--volume /proc:/proc2安装主机/proc,我需要容器的/proc. (因此,这个问题不是Docker - Access host /proc的副本)。

总结:如何在不使用 Docker 容器的情况下获取/proc容器proc文件系统的完全可见实例--privileged

Phi*_*ler 3

这已经在 3 年前的 Docker 19.03 版本中实现了,解决方案是

--security-opt systempaths=unconfined
Run Code Online (Sandbox Code Playgroud)

不幸的是,到目前为止它仍然没有记录。

请注意,它不仅允许访问不受限制的目录/proc,还允许访问更多目录,例如/sys/firmware. 但它仍然应该比--privileged.