我正在尝试在Docker容器中运行命令dmidecode
docker run --device /dev/mem:/dev/mem -it jin/ubu1604
但是,它声称没有许可
root@bd1062dfd8ab:/# dmidecode
# dmidecode 3.0
Scanning /dev/mem for entry point.
/dev/mem: Operation not permitted
root@bd1062dfd8ab:/# ls -l /dev
total 0
crw--w---- 1 root tty 136, 0 Jan 7 03:21 console
lrwxrwxrwx 1 root root 11 Jan 7 03:20 core -> /proc/kcore
lrwxrwxrwx 1 root root 13 Jan 7 03:20 fd -> /proc/self/fd
crw-rw-rw- 1 root root 1, 7 Jan 7 03:20 full
crw-r----- 1 root kmem 1, 1 Jan 7 03:20 mem
drwxrwxrwt 2 root root 40 Jan 7 03:20 mqueue
crw-rw-rw- 1 root root 1, 3 Jan 7 03:20 null
lrwxrwxrwx 1 root root 8 Jan 7 03:20 ptmx -> pts/ptmx
drwxr-xr-x 2 root root 0 Jan 7 03:20 pts
crw-rw-rw- 1 root root 1, 8 Jan 7 03:20 random
drwxrwxrwt 2 root root 40 Jan 7 03:20 shm
lrwxrwxrwx 1 root root 15 Jan 7 03:20 stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Jan 7 03:20 stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Jan 7 03:20 stdout -> /proc/self/fd/1
crw-rw-rw- 1 root root 5, 0 Jan 7 03:20 tty
crw-rw-rw- 1 root root 1, 9 Jan 7 03:20 urandom
crw-rw-rw- 1 root root 1, 5 Jan 7 03:20 zero
这让我感到困惑。由于我可以在主机(ubuntu 14.04)上运行dmidecode -t system
,所以很好。
我什至遵循了一些建议,并设置了dmidecode可执行文件的权限
setcap cap_sys_rawio+ep /usr/sbin/dmidecode
它仍然不起作用。
有什么想法吗?
更新
根据David Maze的回答,该命令应为
run --device /dev/mem:/dev/mem --cap-add SYS_RAWIO -it my/ubu1604a
仅当您要信任容器中运行的内容时才执行此操作。例如,如果您正在原始操作系统上进行测试安装过程。
答案 0 :(得分:1)
Docker提供了一个隔离层,Docker的主要目标之一是从容器中隐藏主机硬件的详细信息。查询主机硬件低级详细信息的最简单,最合适的方法是从主机的根外壳程序中完全忽略Docker。
此操作的实际机制是通过限制Linux capabilities。 功能(7)个文档,您需要CAP_SYS_RAWIO
才能访问/dev/mem
,因此原则上您可以使用--cap-add SYS_RAWIO
启动容器。您可能需要其他功能和/或设备访问权限才能使其真正起作用,因为Docker隐藏了您要访问的内容的详细信息作为设计目标。