如何ssh docker容器

Posted

技术标签:

【中文标题】如何ssh docker容器【英文标题】:how to ssh docker container 【发布时间】:2017-06-22 01:08:19 【问题描述】:

我正在运行容器 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"

我马上就做吗?

【问题讨论】:

如果您指定bash例如 docker exec -it cc55da85b915 /bin/bash(或/usr/local/bin/bash,或bash在该图像中的任何位置)的完整路径会发生什么? @Castaglia 这可能应该是一个公认的答案:) @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" 好的,这就是进步。从rpi-busybox-httpd 存储库中,您的映像看起来是使用dockerize 构建的,它 安装运行所需的文件。在这种情况下,我怀疑您将无法在该映像上执行任何类型的 shell。 好吧,我怀疑,经过大量故障排除后,我尝试了: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 上却是,所以我不知道从哪里可以为我的 pi 上的 docker 获取 CA 证书 【参考方案1】:

您可能需要指定bash完整路径,例如

docker exec -it cc55da85b915 /bin/bash

/usr/local/bin/bash,或该图像中 bash 所在的任何位置。

希望这会有所帮助!

【讨论】:

【参考方案2】:

可能是您的图像没有安装二进制 /bin/bash(如前所述),我遇到了同样的问题,我能够使用 /bin/sh 进入容器

docker exec -ti cc55da85b915 /bin/sh

另一种解决方法是直接执行命令而不访问任何 shell。

docker exec -ti cc55da85b915 ls /etc

【讨论】:

它对我有用!你能告诉我们 -ti 参数的用途是什么吗? @FernandoFradegrada "-t" 用于 "tty",基本上它告诉 docker 分配一个终端会话来执行命令。 "-i" 是交互式的,docker 会一直监听标准输入(键盘),让用户引入更多命令。这是官方文档的链接:docs.docker.com/engine/reference/commandline/exec/#description 工作就像一个魅力!谢谢!! 我想补充一点,当bash 不起作用时,同样的事情也适用于kubectl 命令。【参考方案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

【讨论】:

【参考方案4】:

您使用的图像似乎没有安装二进制 /bin/bash,但它应该有 /bin/sh

试试:

docker exec -it cc55da85b915 sh

【讨论】:

【参考方案5】:

对于基于 Alpine 的映像, docker exec -ti cc55da85b915 /bin/sh 和 docker exec -ti cc55da85b915 ls /etc 有效。正如“Esteban Collado”所建议的那样。

但是对于我使用的其他 Linux 版本, docker exec -ti cc55da85b915 bash

【讨论】:

如果您不添加太多新信息,这可能不需要作为答案【参考方案6】:

如果您仍在寻找答案。这在 Windows 上对我有用。

winpty docker exec -it <containerid> sh

【讨论】:

winpty 是什么? 请阅读这里***.com/questions/48199794/winpty-and-git-bash【参考方案7】:

试试下面的命令:

docker exec -it cc55da85b915 /bin/busybox sh

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

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

【讨论】:

【参考方案8】:

这也与 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

【讨论】:

以上是关于如何ssh docker容器的主要内容,如果未能解决你的问题,请参考以下文章

docker如何启动并连入一个已有的容器

docker:如何在容器之间共享 ssh-keys?

如何在 OSX(boot2docker)上获得与 docker 容器的 ssh 连接

如何打开多个终端进入Docker容器

如何通过 SSH 连接到 MySQL Docker 容器?

sh 如何将SSH代理转发到docker容器中