访问Docker容器中的完整/proc

问题描述 投票:0回答:2

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

linux docker
2个回答
4
投票

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

--security-opt systempaths=unconfined

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

请注意,它不仅允许访问不受限制的

/proc
,还允许访问更多目录,例如
/sys/firmware
。但它仍然应该比
--privileged
更严格。


0
投票

如果您使用 Google Cloud Run,则必须像这样指定这些参数(“编辑容器”>“设置”选项卡)

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.