如何通过SSH连接到Docker容器

62
我正在运行容器 hypriot/rpi-busybox-httpd 我试图通过ssh连接到docker容器,但是出现了以下错误:
pi@raspberrypi:~ $ docker exec -it cc55da85b915 bash
rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:247: starting container process caused "exec: \"bash\": executable file not found in $PATH"

pi@raspberrypi:~ $ docker exec -it cc55da85b915 sh
rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:247: starting container process caused "exec: \"sh\": executable file not found in $PATH"

我这样做对吗?

7
如果您指定完整路径到bash,例如docker exec -it cc55da85b915 /bin/bash(或者 /usr/local/bin/bash,或者 bash 在镜像中的任何位置),会发生什么? - Castaglia
@Castaglia 那应该成为一个被接受的答案 :) - Zathrus Writer
2
@Castaglia @ZathrusWriter 我尝试了 $ docker exec -it baa50167dd75 /bin/bash 但我仍然收到这个错误 rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:247: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory" - Ciasto piekarz
2
好的,这是进展。从 rpi-busybox-httpd 存储库来看,你的镜像似乎是使用 dockerize 构建的,它只安装了运行所需的文件。既然如此,我怀疑你将无法在该镜像上执行任何类型的 shell。 - Castaglia
好的,我怀疑,在大量的故障排除后,我尝试了:docker exec -it baa50167dd75 /bin/bash,现在我得到了这个错误。 could not read CA certificate "/home/pi/.docker/ca.pem": open /home/pi/.docker/ca.pem: no such file or directory 这意味着我需要 Docker 的 CA 证书。在我的树莓派上没有 .docker 文件夹,但在我的 Mac 上有,所以我不知道从哪里获取适用于我的树莓派上 Docker 的 CA 证书。 - Ciasto piekarz
如果您真的想要像问题最初所述那样使用 ssh,您可以按照以下说明操作:https://www.ibm.com/blogs/bluemix/2015/11/docker-workaround-lack-of-network-connectivity-between-client-and-container/ - Nehal J Wani
8个回答

163

可能是您的映像没有安装二进制文件/bin/bash(如之前建议的那样),我曾经遇到过同样的问题,并且我能够使用/bin/sh进入容器。

docker exec -ti cc55da85b915 /bin/sh

另一个解决方法是直接执行命令,而无需访问任何 shell。

docker exec -ti cc55da85b915 ls /etc

它对我有用!还能告诉我们-ti参数是用来做什么的吗? - Fernando Fradegrada
5
"-t" 表示 "tty",基本上它告诉 Docker 分配一个终端会话来执行命令。"-i" 表示交互式,Docker 将继续监听标准输入(键盘)以让用户输入更多命令。这里是官方文档的链接:https://docs.docker.com/engine/reference/commandline/exec/#description - Esteban Collado
运行得很好!谢谢! - Divs
我想补充一点,当bash无法工作时,同样的方法也适用于kubectl命令。 - Aida

23

你正在使用的镜像似乎没有安装二进制文件/bin/bash,但应该有/bin/sh

尝试:

docker exec -it cc55da85b915 sh

3
你有很多不同的方法来实现这一点,你可以使用docker的attach命令进行附加。
$ sudo docker attach cc55da85b915 #by ID

或者您可以使用docker exec命令:

$ sudo docker exec -i -t cc55da85b915 /bin/bash

如果/bin/bash失败了,你可以使用/bin/sh,它在更多的容器中可以工作:

$ sudo docker exec -i -t cc55da85b915 /bin/sh

3
您可能需要指定完整的路径到 bash,例如:/bin/bash
docker exec -it cc55da85b915 /bin/bash

或者/usr/local/bin/bash, 或者其他位置上该镜像所在的bash。

希望这能帮到您!


2
如果你仍在寻找答案,这个方法对我在Windows上有效。
winpty docker exec -it <containerid> sh

winpty 是什么? - Ciasto piekarz
请在此处阅读相关内容:https://dev59.com/AVYM5IYBdhLWcg3w7jc1 - Pradeep Sreeram

1
对于基于Alpine的镜像,运行 docker exec -ti cc55da85b915 /bin/sh 和 docker exec -ti cc55da85b915 ls /etc 命令是有效的。这是由 'Esteban Collado' 建议的。
然而,对于我使用的其他Linux版本,应该运行 docker exec -ti cc55da85b915 bash 命令。

2
如果您没有添加太多新信息,这可能不需要成为答案。 - Mingwei Samuel

1
尝试下面的命令:

docker exec -it cc55da85b915 /bin/busybox sh

要列出所有可用的命令,请使用:

docker exec -it cc55da85b915 /bin/busybox --list

0

这对于Kubernetes的Pod也是相关的。

例如,如果您尝试连接到一个不包含您指定的shell的Pod:

kubectl exec -it some-busybox-pod bash

(busybox 上有 sh 而不是 bash).

你最终会得到相同的错误:

OCI runtime exec failed: exec failed: container_linux.go:349: starting container process caused "exec: \"bash\": executable file not found in $PATH": unknown
command terminated with exit code 126

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接