docker compose:加载共享库时出错:libz.so.1:无法从共享对象映射段:不允许操作

Rob*_*ves 37 linux redhat pyinstaller docker docker-compose

安装dockerdocker-compose后:

NAME="Red Hat Enterprise Linux Server"
VERSION="7.6 (Maipo)"
Run Code Online (Sandbox Code Playgroud)

执行时:

sudo docker-compose -version
Run Code Online (Sandbox Code Playgroud)

它返回:

Error while loading shared libraries: libz.so.1: failed to map segment from shared object: Operation not permitted

它应该返回:

docker-compose version 1.25.0-rc2, build 661ac20e
Run Code Online (Sandbox Code Playgroud)

从 docker-compose 安装是这样的

Rob*_*ves 76

通过重新安装 /tmp 以授予卷执行权限(它可以以只读方式访问)得到解决。所以这解决了:

sudo mount /tmp -o remount,exec
Run Code Online (Sandbox Code Playgroud)

  • 虽然这是一个有效的解决方法,但它不应该是首选答案,因为它不安全。如果您使用的系统已被强化,“/tmp”挂载将设置为“noexec”(可能还有“nodev”和“nosuid”)。在启用“exec”的情况下重新安装它会破坏保护此安装的目的。有关这样做的原因的更多详细信息,请参阅 CIS 基准。 (9认同)
  • @Will 是正确的,`/tmp` 中的 `exec` 不再被认为是安全的。您需要设置一个“TMPDIR” (2认同)

Kev*_*vin 30

配置用户特定的TMPDIR目录可以解决这个问题。的TMPDIR环境变量是POSIX标准,但TMP(和其他一些)可以被普遍接受的为好。

其他答案解决了如何配置全局默认临时目录。如果系统的安全策略不允许/tmp执行,这里有两个示例。

第一个示例解决方案

mkdir $HOME/tmp
export TMPDIR=$HOME/tmp
docker-compose --version
Run Code Online (Sandbox Code Playgroud)

为方便起见,在创建目录后,可以将“export”语句放在 shell 的配置文件配置中(例如:~/.bash_profile~/.bashrc)。

第二个示例解决方案

配置别名(示例文件:~/.bashrc~/.bash_alias)。

alias docker-compose="TMPDIR=${HOME}/tmp docker-compose"
Run Code Online (Sandbox Code Playgroud)

这个问题似乎是一个常见的绊脚石。一些挖掘表明它可能与 PyInstaller 而不是 docker-compose 具体有关。

  • docker 已经以 root 身份运行,所以 $HOME/tmp 只是指向 /root/tmp,这是问题的原因,因为它没有 exec 标志,我不想搞乱我的安全性系统。所以我做了 mkdir /root/docker_temp 并设置了导出 TMPDIR=/root/docker_temp 并且它起作用了,但我正在重新考虑如何以及谁将清理该文件夹中的所有数据,因为它的行为不像真正的 tmp。有什么想法吗? (3认同)