通过SSH执行Docker exec提示No such container错误求助
解决Docker容器SSH连接报错"No such container"的问题
这个问题我之前也踩过坑,核心原因出在容器ID的获取方式不可靠以及SSH伪终端带来的输出干扰上,咱们一步步拆解解决:
为什么你的命令会失败?
依赖不稳定的docker ps输出格式
你用docker ps | head -n 2 | tail -n 1 | cut -d' ' -f1提取容器ID,这种方式完全依赖docker ps的默认输出排版。docker ps的列之间是多个连续空格,cut -d' ' -f1会把连续空格当成多个分隔符,很可能拿到空字符串或者错误的字段;如果docker版本更新导致输出格式微调,这个命令直接失效。SSH -t参数引入控制字符
你在获取容器ID时用了ssh -t,这个参数会分配伪终端,远程输出会带上终端控制字符(比如换行符的转义序列),导致你拿到的CONTAINER_ID包含不可见的特殊字符,传到远程后docker自然找不到这个"带垃圾字符的容器ID"。
可靠的解决方案
推荐两种更稳定的写法,按需选择:
方案1:分两步执行(清晰易调试)
先在本地获取正确的容器ID,再执行exec命令:
# 用docker内置的格式化参数直接提取容器ID,-n 1表示取最近运行的一个容器 CONTAINER_ID=$(ssh user@host "docker ps --format '{{.ID}}' -n 1") # 连接远程并执行容器进入命令 ssh -tt user@host "docker exec -it $CONTAINER_ID /bin/bash"
方案2:单SSH会话完成(减少连接次数)
直接在远程shell里完成容器ID获取和exec操作,避免本地变量传递的问题:
ssh -tt user@host ' # 在远程机器上执行变量赋值和容器连接 CONTAINER_ID=$(docker ps --format "{{.ID}}" -n 1) docker exec -it $CONTAINER_ID /bin/bash '
验证方法
你可以先单独执行容器ID提取命令,确认输出是正确的容器ID:
ssh user@host "docker ps --format '{{.ID}}' -n 1"
如果输出是一串干净的12位或64位容器ID,再组合后面的exec命令就不会出错了。
内容的提问来源于stack exchange,提问作者Matt Adelman
相关产品推荐
相关产品推荐

