无法在Docker容器中执行二进制文件(“Operation not permitted”)

问题

我正在构build一个Docker容器(基于RHEL),其中包含来自第三方存储库的自定义二进制文件。 在容器中执行二进制文件时,我收到一个不起眼的错误:“ Operation not permitted ”。

分析

Dockerfile

Dockerfile非常简单。

 FROM dockerregistry.example.com/rhel7:latest RUN yum -y install \ curl \ custom-package && \ curl -Lsq https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64 > /sbin/dumb-init && \ chmod 755 /sbin/dumb-init && \ yum clean all ADD custom-package.conf /etc/custom-package/custom-package.conf ENTRYPOINT ["/sbin/dumb-init", "--"] CMD ["/usr/local/custom-package/bin/custom-package", "--config", "/etc/custom-package/custom-package.conf"] 

build立图像

我使用以下命令构build并在我的工作站上input容器。

 $ docker build -t custom-package:v1 . $ docker run --security-opt seccomp:unconfined -d custom-package:v1 tail -f /dev/null $ docker exec -it <image ID> /bin/bash 

“不允许操作”

一旦我在图像中,如果我尝试执行二进制文件,我收到一个非常无益的错误。 运行strace也给出了一个令人困惑的输出。 在检查文件权限和元数据时,似乎没有问题。

 # /usr/local/telegraf/bin/telegraf bash: /usr/local/telegraf/bin/telegraf: Operation not permitted # strace -f /usr/local/telegraf/bin/telegraf execve("/usr/local/telegraf/bin/telegraf", ["/usr/local/telegraf/bin/telegraf"], [/* 17 vars */]) = -1 EPERM (Operation not permitted) write(2, "strace: exec: Operation not perm"..., 38strace: exec: Operation not permitted ) = 38 exit_group(1) = ? +++ exited with 1 +++ # ls -l /usr/local/telegraf/bin/telegraf -rwxr-xr-x 1 telegraf telegraf 38664736 Jun 3 15:41 /usr/local/telegraf/bin/telegraf # getcap -v /usr/local/telegraf/bin/telegraf /usr/local/telegraf/bin/telegraf = cap_sys_rawio+ep 

我无法收集足够的信息来debugging我的容器,为什么可执行二进制文件不工作。 有什么突出的是错误的,或者是我会得到这样一个无益的错误的原因吗?

谢谢!

SYS_RAWIOfunction需要使用--privileged选项来访问设备。 见能力(7)。

http://man7.org/linux/man-pages/man7/capabilities.7.html

  CAP_SYS_RAWIO * Perform I/O port operations (iopl(2) and ioperm(2)); * access /proc/kcore; * employ the FIBMAP ioctl(2) operation; * open devices for accessing x86 model-specific registers (MSRs, see msr(4)) * update /proc/sys/vm/mmap_min_addr; * create memory mappings at addresses below the value specified by /proc/sys/vm/mmap_min_addr; * map files in /proc/bus/pci; * open /dev/mem and /dev/kmem; * perform various SCSI device commands; * perform certain operations on hpsa(4) and cciss(4) devices; * perform a range of device-specific operations on other devices.