CentOS 7下Docker-Compose共享库映射异常问题求助
你碰到的这个docker-compose: error while loading shared libraries: libz.so.1: failed to map segment from shared object错误,确实和你猜测的一样——/tmp目录挂载时设置了noexec选项。Docker-Compose运行时会在临时目录(默认是/tmp)解压并加载依赖的共享库,而noexec会禁止在该目录下执行二进制文件,自然就没法完成库的映射了。
先看看你的fstab里的问题点:
/root/images/tmpfile.bin /tmp ext4 rw,noexec,nosuid,nodev 0 0 /tmp /var/tmp none rw,noexec,nosuid,nodev,bind 0 0
这两行都给/tmp加上了noexec,而你那台正常运行的服务器,fstab里根本没给/tmp单独设置挂载选项,用的是默认的defaults,所以不会有这个限制。
下面给你几个解决方案,你可以根据自己的需求选:
1. 临时修复(重启后失效)
如果只是想临时验证问题,直接重新挂载/tmp并开启exec权限:
mount -o remount,rw,exec /tmp
执行完再跑docker-compose --version应该就能正常显示版本了。
2. 永久修改fstab(推荐)
如果要彻底解决,需要编辑/etc/fstab,把涉及/tmp的两行里的noexec选项删掉:
修改后的内容应该是这样:
tmpfs /dev/shm tmpfs nodev,nosuid,noexec 0 0 /root/images/tmpfile.bin /tmp ext4 rw,nosuid,nodev 0 0 /tmp /var/tmp none rw,nosuid,nodev,bind 0 0
注意/dev/shm的noexec可以保留,不影响Docker-Compose。修改完执行下面的命令让设置立即生效:
mount -o remount /tmp
这样重启服务器后也会保持生效。
3. 不修改/tmp,指定Docker-Compose的临时目录
如果你不想改动/tmp的安全设置(毕竟noexec是个安全选项),可以给Docker-Compose指定一个没有noexec限制的临时目录,比如/var/tmp:
export TMPDIR=/var/tmp docker-compose --version
如果测试有效,可以把这个环境变量加到用户的~/.bashrc或者系统的/etc/profile里,这样每次登录都会自动生效:
比如编辑~/.bashrc,最后加上一行:
export TMPDIR=/var/tmp
然后执行source ~/.bashrc让设置立即生效。
备注:内容来源于stack exchange,提问作者Usman Rafiq

