总结:在维护者Docker容器中的Busybox "sh“中不存在任何命令。
细微差别,一如既往:
有一个维护者工具映像,我想让shell访问。为什么我需要壳牌进入那里?这是因为我希望通过附加的docker套接字文件映射来发现连接多个坞上下文的能力(默认情况除外)。
维护者开发人员采取了一些步骤(他们说是出于安全原因)来禁用在正在运行的容器中获取交互控制台的能力--没有bin/bash、bin/sh等。
我从https://busybox.net/downloads/binaries/1.35.0-x86_64-linux-musl/busybox下载了Busybox
并根据原始维护者一个创建了自己的调试容器:
Dockerfile:
FROM portainer/portainer-ce:2.9.3
LABEL destiny="Portainer debug"
ADD busybox busybox
ENTRYPOINT [""]
CMD [""]执行图像生成命令:
docker build -f Dockerfile -t portainer_debug:latest ...。然后用它启动一个容器:
docker run --name ppp -it portainer_debug /busybox sh我进入了正在运行的容器内的一个外壳。不幸的是,我发现没有可用的命令。例如,ls命令返回:
/ # ls
sh: ls: not found
/ # 这也意味着Busybox命令(上面的sh)在容器启动时充当参数。我用"ls“作为调情词检查了一下:
$ docker run --name ppp -it portainer_debug /busybox ls
busybox docker-compose kubectl sys
data etc portainer tmp
dev helm proc
docker kompose public
$注意:“退出”命令在"sh“中工作。
与高山图像相同的摘录也如预期的那样工作:
/ # ls
bin busybox dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
/ # 如果有人能提出下一步的建议,我会很高兴和非常感激,以理解为什么busybox“忘记”所有命令。
发布于 2022-07-04 23:13:59
来自https://busybox.net/downloads/BusyBox.html:
使用
BusyBox是一个多调用二进制文件.多调用二进制程序是一个可执行程序,它执行与多个实用程序相同的工作。这意味着只有一个BusyBox二进制文件,但是单个二进制文件的作用类似于大量的实用程序。这允许BusyBox更小,因为所有内置的实用程序(我们称之为applet)都可以共享许多常见操作的代码。
还可以通过在命令行上发出作为参数的命令来调用BusyBox。例如,输入
/bin/busybox ls
也会导致BusyBox表现为'ls‘。
当然,在每个命令中添加'/bin/busybox‘将是痛苦的。因此,大多数人将使用指向BusyBox二进制文件的链接来调用BusyBox。
例如,输入
-s /bin/busybox ls ./ls
将导致BusyBox表现为'ls‘(如果'ls’命令已编译为BusyBox)。一般来说,您不需要自己创建所有这些链接,因为在运行“make”命令时,BusyBox构建系统将为您提供这些链接。
如果您调用没有参数的BusyBox,它将为您提供已编译到BusyBox二进制文件中的小程序列表。
您只将二进制busybox复制到图像中。您可以执行./busybox ls或创建符号链接,如果希望shell找到它们,则可以将带有符号链接的目录添加到$PATH。
为什么busybox“忘记”所有命令。
Busybox没有“忘记”任何东西,它是无生命的,你只是没有正确地使用。
例如,下面是:
image.
Dockerfile,我只是把安装在主机上的busybox可执行文件挂载到了码头容器中。与container.
/busybox sh shell -c,后者执行脚本/busybox mkdir /binfor i in $(/busybox list) /bin目录- /busybox ln -s /busybox /bin/$i中的busybox可执行文件创建一个符号链接
- the above two steps are exactly as explained in Busybox faq [https://busybox.net/FAQ.html#getting\_started](https://busybox.net/FAQ.html#getting_started)
- then the script executes an interactive shell to interact with me因为在PATH中/bin是默认的,在创建目录和符号链接之后,所有Busybox工具都是可用的。注意,在创建带有符号链接的PATH目录之前,所有命令都预先加上了/busybox,以方便上面文档中解释的Busybox调用。
$ docker run -ti --rm --entrypoint '' -v /bin/busybox:/busybox:ro portainer/portainer-ce:2.9.3 /busybox sh -c '/busybox mkdir /bin; for i in $(/busybox --list); do /busybox ln -s /busybox /bin/$i; done; sh -li'
/ # ls
bin data docker etc kompose portainer public tmp
busybox dev docker-compose helm kubectl proc sys
/ # echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binhttps://stackoverflow.com/questions/72862614
复制相似问题