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

Posted

技术标签:

【中文标题】docker compose:加载共享库时出错:libz.so.1:无法从共享对象映射段:不允许操作【英文标题】:docker compose: Error while loading shared libraries: libz.so.1: failed to map segment from shared object: Operation not permitted 【发布时间】:2020-01-07 20:18:07 【问题描述】:

dockerdocker-compose 上安装后:

NAME="Red Hat Enterprise Linux Server"
VERSION="7.6 (Maipo)"

执行时:

sudo docker-compose -version

返回:

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

从 docker-compose 安装是 this

【问题讨论】:

【参考方案1】:

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

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

第一个示例解决方案

mkdir $HOME/tmp
export TMPDIR=$HOME/tmp
docker-compose --version

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

第二个示例解决方案

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

alias docker-compose="TMPDIR=$HOME/tmp docker-compose"

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

【讨论】:

docker 已经以 root 身份运行,所以 $HOME/tmp 只是指向 /root/tmp 这是问题的原因,因为它没有 exec 标志,我不想要搞乱我系统的安全性。所以我做了 mkdir /root/docker_temp 并设置了 export TMPDIR=/root/docker_temp 并且它起作用了,但是我正在重新考虑如何以及谁将清理该文件夹中的所有数据,因为它的行为不像真正的 tmp。有什么想法吗? @OAH,根据我的经验,作为root 用户做大多数“正常”的事情都是一个坏主意。相反,寻找像 sudo 这样的替代品,或者在 Docker 的情况下,为普通用户提供 docker 组。例如,如果我的用户是kevin,那么sudo usermod -a -G docker kevin 会将docker 组附加到我的组列表中。可以通过groups kevin进行验证。 @OAH,此时我们可能应该将此移至一个新问题。似乎您可能已经忘记了这里的问题不是 docker,而是 docker-compose 以及它的打包方式。 docker-compose 是一个 python 程序,它使用 PyInstaller 对其进行打包以方便使用。 PyInstaller 需要一些 tmp 空间来解包和执行一些东西,以便 docker-compose 工作。 PyInstaller 应始终自行清理。从我的机器上查看 tmp 目录,从来没有留下任何东西。 @OAH,再提醒一句。导出TMPDIR 会将其放入您从该shell 运行的每个命令的环境中。这意味着,在您的示例中,每个命令都将使用 /root/tmp_alternative 作为 tmp 空间。并非所有程序都可以自行清理,因此需要注意。【参考方案2】:

我遇到了同样的问题,Kevin 的两个示例解决方案都对我有用,这是我所做的:

我按照 Kevin 说的做,我把 export TMPDIR=$HOME/tmp 放到了 ~/.bashrc 文件中

【讨论】:

【参考方案3】:

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

sudo mount /tmp -o remount,exec

【讨论】:

也为我工作。 虽然这是一种有效的解决方法,但它不应该是首选答案,因为它不安全。如果您使用的系统已经过强化,/tmp 挂载将设置为noexec(可能还有nodevnosuid)。启用exec 重新安装它会破坏保护此安装的目的。有关为什么这样做的更多详细信息,请参阅 CIS 基准。 也为我工作 @Will 是正确的,/tmp 中的exec 不再被认为是安全的。您需要设置一个TMPDIR

以上是关于docker compose:加载共享库时出错:libz.so.1:无法从共享对象映射段:不允许操作的主要内容,如果未能解决你的问题,请参考以下文章

加载共享库时出错:libgfortran.so.1:无法打开共享对象文件:没有这样的文件或目录

Rails:运行 wkhtmltopdf 时出错——(加载共享库时出错)

加载共享库时出错:libncurses.so.5:

加载共享库时出错,无法打开共享对象文件:没有这样的文件或目录(hiredis)

加载共享库时出错:libgmock.so:无法打开共享对象文件:没有这样的文件或目录

/usr/share/code/bin/../code:加载共享库时出错:libX11-xcb.so.1:无法打开共享对象文件: