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 【问题描述】:在 docker 和 docker-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
(可能还有nodev
和nosuid
)。启用exec
重新安装它会破坏保护此安装的目的。有关为什么这样做的更多详细信息,请参阅 CIS 基准。
也为我工作
@Will 是正确的,/tmp
中的exec
不再被认为是安全的。您需要设置一个TMPDIR
以上是关于docker compose:加载共享库时出错:libz.so.1:无法从共享对象映射段:不允许操作的主要内容,如果未能解决你的问题,请参考以下文章
加载共享库时出错:libgfortran.so.1:无法打开共享对象文件:没有这样的文件或目录
Rails:运行 wkhtmltopdf 时出错——(加载共享库时出错)
加载共享库时出错,无法打开共享对象文件:没有这样的文件或目录(hiredis)
加载共享库时出错:libgmock.so:无法打开共享对象文件:没有这样的文件或目录
/usr/share/code/bin/../code:加载共享库时出错:libX11-xcb.so.1:无法打开共享对象文件: