同时输入两个字母会导致 docker exec -it shell 突然退出

Typing two letters at the same time causes docker exec -it shell to exit abruptly

我 运行正在 Docker VirtualBox 上的工具箱 Windows 10。

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

容器仍将是 运行ning。

知道这是什么吗?

更多详情

这是我 运行 在里面的最小 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 中,我开始 运行ning 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,虽然这个是用于 docker 用于 windows,而不是 docker 工具箱。

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

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

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

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

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

作为解决方法,在您的 docker exec 命令前加上 winpty 前缀,winpty 随 git bash 一起提供。

例如。

winpty docker exec -it mycontainer sh