【发布时间】: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