默认情况下,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
如何在 Docker 中禁用此行为(当前使用版本 18.09)? 我需要访问一个
proc
实例,而无需在其上进行任何挂载,否则嵌套容器(例如,带有 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
此操作会失败并显示
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
但是,
--privileged
为容器提供了更多权限(功能、设备访问权限等),而我不希望这样。我只需要完全访问/proc
。
如果其中一个挂载没有重叠挂载,那么我也可以将
proc
文件系统在容器中挂载两次。不幸的是,使用 --volume /proc:/proc2
将主机的 /proc
挂载到容器中,而我需要容器的 /proc
。 (因此,这个问题不是 Docker - Access host /proc 的重复)。
总结:如何在不使用
/proc
的情况下在 Docker 容器中获取容器的 proc
文件系统的完全可见的 --privileged
实例?
这已经是3年前在Docker中实现的19.03版本了,解决方案是
--security-opt systempaths=unconfined
不幸的是,到目前为止它仍然没有记录。
请注意,它不仅允许访问不受限制的
/proc
,还允许访问更多目录,例如 /sys/firmware
。但它仍然应该比--privileged
更严格。