当我按以下方式运行docker时:
docker run -it -e LD_PRELOAD=/bin/xyz.so bash env
它按预期运行,输出为:
HOSTNAME=2116ac3bae11
_BASH_VERSION=4.4
_BASH_LATEST_PATCH=23
PWD=/
HOME=/root
_BASH_GPG_KEY=7C0135FB088AAF6C66C650B9BB5869F064EA74AB
TERM=xterm
SHLVL=0
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_BASH_PATCH_LEVEL=18
LD_PRELOAD=/bin/xyz.so
但是,当我运行相同的命令但使用另一个图像(例如ubuntu或centos)时:
docker run -it -e LD_PRELOAD=/bin/xyz.so ubuntu env
docker run -it -e LD_PRELOAD=/bin/xyz.so centos:7 env
LD_PRELOAD变量从输出中消失:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=00b161980ef6
TERM=xterm
HOME=/root
谁能解释命令之间的区别? 如何使用LD_PRELOAD运行centos映像?
似乎是一些docker安全机制可以从环境变量中清除LD_PRELOAD。但是,为什么只在最后一个命令中而不是在第一个命令中?
Docker版本17.12.1-ce,内部版本7390fc6
答案 0 :(得分:-1)
您的 ld_preload 共享对象可能不存在于这些 docker 镜像中,或者它依赖于其他 docker 镜像中不存在的依赖项。 您可以通过查看 Docker 映像文件系统中的共享对象及其依赖项来轻松搞定。要找出依赖项,请使用“ldd /bin/xyz.so”作为依赖项。