同时输入两个字母会导致 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
我 运行正在 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