bash - 无法在 Docker 容器 ("Operation not permitted"中执行二进制文件)

标签 bash docker centos dockerfile rhel

问题

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

分析

Docker文件

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"]

构建图像

我使用以下命令在我的工作站上构建并进入容器。

$ 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

我无法收集足够的信息来调试我的容器以及为什么可执行二进制文件不工作。有什么明显的错误或我会收到这样无用的错误的原因吗?

谢谢!

最佳答案

SYS_RAWIO 功能需要--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.

关于bash - 无法在 Docker 容器 ("Operation not permitted"中执行二进制文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45065707/

相关文章:

linux - 使用 Bash 发送多个 SSH 命令

bash - 如何让 Vim 从 shebang 行检测文件类型?

python - 强制 python 脚本从 STDIN 获取输入

regex - 在 GNU Linux (AWK/SED/GREP) 中选择与模式文件中的任何模式不匹配的 CSV 行

python - yum 默认将 python 包安装到磁盘上的什么位置?

centos - php72-fpm 的 selinux 权限

docker - plesk 上 docker 中的 Neo4j(3.4.17、3.5.13、4.0.0)不使用/ssl 中提供的 SSL 证书,而是尝试删除它们并进行自己的自签名

docker - 在 docker 中,commit 和 dockerfile 的区别

通过 docker 的 Rstudio 无法读取/etc/.odbc.ini,只能读取 ~/.odbc.ini

linux - openssh RPM CentOS 6.5 的 Pam 配置