Ctrl-p and Ctrl-n behaving unexpectedly under Dock

2020-05-26 08:13发布

问题:

For the life of me I can't seem to figure out why ctrl-p and ctrl-n don't work like they're supposed to under the Docker images I have been working with. ctrl-p should work just like the up arrow but I usually have to press it twice to get the last command I ran. And it cycles through the history in what seems to be a random fashion.

Maybe someone can help me make some sense of this.

docker run -it buildpack-deps:trusty # run a Linux based image

root@74cbcf321fae:/# ls
bin  boot  dev  etc  home  lib  lib64  ...
root@74cbcf321fae:/# touch hello

If I press up here, it should show the touch command, followed by ls. If I press Ctrl-p however, nothing comes up the fist time. When I press it again, ls appears magically.

Can someone help me make sense of these. I can't live without Ctrl-p and Ctrl-n.

回答1:

It looks like this has been removed (or moved) in the Docs, but it used to live here: https://docs.docker.com/engine/reference/commandline/attach/

Edit: It looks like they reference the below in the Configuration Files documentation.

The command sequence to detach from a docker container is ctrl-p ctrl-q, which is why ctrl-p doesn't work as expected. When you hit ctrl-p, docker is waiting on ctrl-q, so nothing happens.

You can use the new --detach-keys argument to docker run to override this sequence to be something other than ctrl-p:

docker run -ti --detach-keys="ctrl-@" ubuntu:14.04 bash

$# ls
$# <--- Ctrl-P here will display ls now
$# <--- Ctrl-@ here will detach from the running container

If you want, you can add this to your ~/.docker/config.json file to persist this change:

{
    ...
    "detachKeys": "ctrl-@",
    ...
}

More details on this can be found here: https://github.com/docker/docker/pull/15666 as I can't find it in the docs anymore.