はじめに
Docker コンテナ内で作業していると、 shell の直前のコマンド履歴を呼び出す Ctrl-p が2回押さないと反応しないことがあります。
本記事では、この問題の原因と簡単な解決策を紹介します。
問題の詳細
docker exec -it <コンテナID> でコンテナ内に入ると、通常のシェルで前のコマンドを呼び出す Ctrl-p が期待通りに動作しません。
最初のキー入力では反応せず、2回目入力して初めて反応します。
ショートカットに慣れているほど、この挙動はストレスになります。
$ docker exec -it my-container bash
root@container:/# Ctrl-p # <- 反応しない
root@container:/# Ctrl-p # <- 今度は反応する原因
実は、これは Docker の仕様によるものです。Docker では、デフォルトで detachKey という設定が Ctrl-p + Ctrl-q に設定されています。
つまり、コンテナ内でキーを入力する際に:
- Ctrl-p を押すと、Docker デモンは「次に Ctrl-q が来るのか?」と待機状態に入ります
- 別のキーが入力されるか、タイムアウトして初めて Ctrl-p が実際にシェルに送信されます
このため、Ctrl-p が1回目では反応しないという問題が発生するわけです。
解決策
この問題を解決するには、Docker の設定ファイルで detachKey を変更する必要があります。
ステップ1: 設定ファイルを編集
~/.docker/config.json ファイルを開いて、以下のように detachKeys を指定してください。(例では ctrl-\\ を使用していますが、自分が使いやすいキーを割り当ててください。)
{
"detachKeys": "ctrl-\\"
}このように設定することで、Ctrl-p との競合がなくなり、シェルに直接入力されるようになります。
ステップ2: 変更を確認
設定ファイルを保存した後、再度コンテナに入って Ctrl-p が正常に動作するか確認します。
$ docker exec -it my-container bash
root@container:/# Ctrl-p # <- 今度は1回で反応する補足
- 設定ファイルが存在しない場合は、新規作成してください
- detachKey 自体が不要な場合は、空文字列
""を設定することもできます - 既に実行中のコンテナに対しては、設定変更後にコンテナを再度アタッチするか、新しいセッションを開いてください
まとめ
この記事では、Docker コンテナ内で Ctrl-p が2回押さないと反応しない問題の原因と解決策を紹介しました。
細かい設定ですが、 shell のショートカットをよく使う人はやっておくと快適になります。ぜひ試してみてください。

コメント