Dockerコンテナ内でCtrl-pが2回押さないと反応しない問題の対策

Docker

はじめに

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 に設定されています。

つまり、コンテナ内でキーを入力する際に:

  1. Ctrl-p を押すと、Docker デモンは「次に Ctrl-q が来るのか?」と待機状態に入ります
  2. 別のキーが入力されるか、タイムアウトして初めて 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 のショートカットをよく使う人はやっておくと快適になります。ぜひ試してみてください。

コメント

タイトルとURLをコピーしました