【问题标题】:LD_PRELOAD in docker泊坞窗中的 LD_PRELOAD
【发布时间】:2018-12-20 19:03:57
【问题描述】:

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

【问题讨论】:

  • 在我的盒子上工作(docker 18.05.0 - mac;docker 17.05.0 - linux)。我建议不要使用LD_PRELOAD,而是使用卷挂载覆盖/etc/ld.so.preload 文件。它应该具有相同的效果。

标签: ubuntu docker centos ld-preload


【解决方案1】:

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

【讨论】:

  • 这仍然不能解释为什么env 不打印LD_PRELOAD 的值。但我不能在这里复制; centos 打印出来对我来说很好(来自 DockerHub 的标准 CentOS 映像)。
猜你喜欢
  • 2017-10-12
  • 2019-06-28
  • 2021-11-05
  • 2016-10-20
  • 1970-01-01
  • 2021-09-08
  • 2015-10-08
  • 2017-02-02
  • 2019-01-15
相关资源
最近更新 更多