Docker中的LD_PRELOAD

时间:2018-07-12 13:54:16

标签: ubuntu docker centos ld-preload

当我按以下方式运行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

1 个答案:

答案 0 :(得分:-1)

您的 ld_preload 共享对象可能不存在于这些 docker 镜像中,或者它依赖于其他 docker 镜像中不存在的依赖项。 您可以通过查看 Docker 映像文件系统中的共享对象及其依赖项来轻松搞定。要找出依赖项,请使用“ldd /bin/xyz.so”作为依赖项。