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

时间:2018-02-11 20:42:16

标签: shell docker docker-toolbox

我在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工具箱。

3 个答案:

答案 0 :(得分:3)

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

作为一种解决方法,在你的docker exec命令前加上winpty,它带有git bash。

例如。

winpty docker exec -it mycontainer sh

答案 1 :(得分:1)

执行sap.ui.define([ "sap/ui/core/mvc/Controller", "sap/ui/model/Filter", "sap/ui/model/FilterOperator" ], function(Controller, Filter, FilterOperator) { "use strict"; return Controller.extend("ActivitiesActivities.controller.Main", { onSearch : function(oEvent) { // build filter array var aFilter = []; // fetch event parameter var sQuery = oEvent.getParameter("query"); // retrieve list control var oList = this.getView().byId("results"); // get binding for aggregation 'items' var oBinding = oList.getBinding("items"); if (sQuery) { aFilter.push(new Filter("CategoryName", FilterOperator.Contains, sQuery)); } // apply filter. an empty filter array will show all items oBinding.filter(aFilter); } }); }); 时,请检查您登录的USERdocker exec -it yourContainer sh.bahsrc.bash_profile可能包含一个命令,可以解释会话突然退出的原因。

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

答案 2 :(得分:1)

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

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