【问题标题】:Typing two letters at the same time causes docker exec -it shell to exit abruptly同时输入两个字母会导致 docker exec -it shell 突然退出
【发布时间】:2018-07-22 00:27:58
【问题描述】:

我在 Windows 10 的 VirtualBox 上运行 Docker Toolbox。

我遇到了一个烦人的问题,如果我 docker exec -it mycontainer sh 进入容器 - 进行检查,当我输入命令时,shell 会突然随机退出到主机 shell。一些实验表明,当我同时按下两个字母时(在触摸打字时很常见)会导致退出。

容器仍将运行。

任何想法这是什么?

更多详情

这是我在里面运行的一个最小的 docker 镜像。本质上,我正在尝试通过 kops 将 kubernetes 集群部署到 AWS,但是因为我在 Windows 上,所以我必须使用容器来运行 kops 命令。

FROM alpine:3.5

#install aws-cli
RUN apk add --no-cache \
  bind-tools\
  python \
 python-dev \
 py-pip \
 curl


RUN pip install awscli 

#install kubectl
RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
RUN chmod +x ./kubectl
RUN mv ./kubectl /usr/local/bin/kubectl


#install kops
RUN curl -LO https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-linux-amd64
RUN chmod +x kops-linux-amd64
RUN mv kops-linux-amd64 /usr/local/bin/kops

我构建了这个图像:

docker build -t mykube . 

我在我尝试部署的项目的工作目录中运行它:

docker run -dit -v "${PWD}":/app mykube

exec进入shell:

docker exec -it $containerid sh 

在 shell 中,我开始运行 AWS 命令​​as per here

这是一些示例输出:

##output of previous dig command 
;; Query time: 343 msec
;; SERVER: 10.0.2.3#53(10.0.2.3)
;; WHEN: Wed Feb 14 21:32:16 UTC 2018
;; MSG SIZE  rcvd: 188

##me entering a command
/ # aws s3 mb s3://clus
##shell exits abruptly to host shell while I'm writing
DavidJ@DavidJ-PC001 MINGW64 ~/git-workspace/webpack-react-express (master)
##container is still running 
$ docker ps --all
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
37a341cfde83        mykube              "/bin/sh"           5 minutes ago       Up 3 minutes                            gifted_bhaskara
##nothing in docker logs
$ docker logs --details 37a341cfde83

更有用的更新

添加-D 标志提供了一个重要线索:

$ docker -D exec -it  04eef8107e91 sh -x
DEBU[0000] Error resize: Error response from daemon: no such exec
                                                                  / #
/ #
/ #
/ #
/ # sdfsdfjskfdDEBU[0006] [hijack] End of stdin
DEBU[0006] [hijack] End of stdout

另外,我已经确定导致问题的具体原因是同时按下两个字母(这在我触摸打字时很常见)。

似乎有一个github issue for this here,虽然这个是用于 Windows 的 docker,而不是 docker 工具箱。

【问题讨论】:

  • 没有minimal reproducible example,不好说。也就是说,您可以添加的复制器不足的一件事是 sysdig 跟踪 shell 进程发生了什么——这样我们可以看到它是否收到信号(以及哪个信号),被告知其标准输入正在关闭,或其他正在发生的事情。 (Sysdig 可以从一个容器运行以监控另一个容器中的操作,使其成为特别适合此特定工作的诊断工具)。
  • (对一个模糊的问题给予赏金并不会使其更容易回答,但它确实将它弹到列表的顶部,使其无法关闭没有主持人参与,尽管缺乏可操作和有用的细节,但会产生大量试图猜测的人的活动。如果你真的想要一个答案,而不是attention,但是,对经过测试以允许其他人自己重现问题或诊断日志的程序采取具体步骤会更有成效)。
  • 您确定容器没有出现故障并重新启动吗?因为这正是会发生的事情。 docker ps --all 是否显示了一堆失败或退出的容器?

标签: shell docker docker-toolbox


【解决方案1】:

这个问题似乎是 docker 和 windows 的错误。 See the github issue here.

作为一种变通方法,在您的 docker exec 命令前面加上 git bash 附带的 winpty。

例如。

winpty docker exec -it mycontainer sh

【讨论】:

  • 良好的反馈和不错的收获。 +1
【解决方案2】:

检查USER,这是您在执行docker exec -it yourContainer sh 时登录的那个。
它的.bahsrc.bash_profile.profile 可能包含一个命令,可以解释会话突然退出的原因。

还要检查与该容器 (docker logs --details yourContainer) 关联的日志,以查看该关闭的会话是否在 stderr 中生成任何内容。

【讨论】:

    【解决方案3】:

    我能想到的在您的容器中杀死进程的原因包括:

    • 容器中退出的 Pid 1。这将导致容器进入停止状态,但重启策略可能已经重启了它。查看您的docker container inspect 输出以查看是否发生这种情况。这是我见过的最常见的原因。
    • 操作系统内存不足,内核将在其中终止进程。查看您的系统日志和 dmesg 以了解是否发生这种情况。
    • 超出容器内存限制,docker 会杀死容器,可能会根据您的策略重新启动它。您将再次查看docker container inspect,但状态将具有不同的详细信息。
    • 主机上的进程可能被安全工具杀死。
    • 可能违反了 selinux 或 apparmor 政策。
    • 网络问题。我自己从未遇到过,但由于 docker 是客户端/服务器设计,因此网络断开连接可能会导致 exec 会话中断。
    • 服务器本身出现故障,您会在 syslog / dmesg 中看到各种日志,表明它无法恢复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      相关资源
      最近更新 更多