默认情况下,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?
这已经在 3 年前的 Docker 19.03 版本中实现了,解决方案是
--security-opt systempaths=unconfined
Run Code Online (Sandbox Code Playgroud)
不幸的是,到目前为止它仍然没有记录。
请注意,它不仅允许访问不受限制的目录/proc,还允许访问更多目录,例如/sys/firmware. 但它仍然应该比--privileged.