默认情况下,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
实例?