📝

fish+pecoでDockerのイメージ、コンテナを簡単に選択する

2023/06/02に公開

イメージIDやコンテナIDの指定が必要なDockerのサブコマンドを使うたびに、事前にdocker imagesdocker psを実行してIDをコピーして貼り付けるのは面倒ですよね。

pecoghqを組み合わせたGitリポジトリの選択や、gitコマンドとpecoを組み合わせたブランチの選択の方法はネットに多くの記事がありますが、Dockerのイメージやコンテナの選択にpecoを使用する例については情報が少ないので、何か良い方法がないか考えてみました。
その結果、良い方法が見つかりましたのでこちらのリポジトリに公開しました。

https://github.com/ikoba/docker-fish-functions

どんなdockerコマンドとも組み合わせられます

イメージID、コンテナIDを指定する任意のdockerコマンドで、imagecontainerと入力してスペースキーを押すと、pecoが起動してIDを絞り込めます。

単一選択

複数選択もできます。

複数選択

実装方法について

image, containerからイメージID、コンテナIDへの置換は、fishのabbrを使用しています。

abbrは長いコマンド文字列の省略形 (abbreviation) を登録する機能です。aliasと機能的に似ていますが、入力した省略形が元の文字列に置換されて展開されることが異なります。

デフォルトでは固定の文字列にしか置換できませんが、-f / --functionオプションに関数名を指定すると、その関数内で標準出力に出力した内容に置換されます。
つまり、置換する文字列を関数内のロジックで自由に決められます。この機能を使用してpecoで選択したイメージID、コンテナIDに置換しています。

また、--positon anywhereを指定すると、入力した省略形がコマンドの位置にある場合だけではなく、パラメーターの位置にある場合にも置換できるようになります。
dockerのイメージID、コンテナIDは、複数のサブコマンド(run, exec, start, stop, rm, rmi, ...)で使用されるパラメーターなので、これらのサブコマンドごとに関数を作成してabbrに登録するのは冗長です。
そのため、このオプションを使用してパラメーターであるimage, containerをabbrとして登録しています。
ただし、意図せず置換されないようにdockerコマンドのパラメーターとして入力された時のみ置換するようにしています。

config.fish
abbr -a container --position anywhere -f select_docker_container
abbr -a image --position anywhere -f select_docker_image
select_docker_container.fish
function select_docker_container
  if not string match -q "docker*" (commandline)
    return 1
  end

  echo (docker ps -a | peco --initial-index 1 | awk '{print $1}' | tr "\r" " ")
end

最後に

これまでなんとなく使っていfishのabbrですが、かなり柔軟性が高いことがわかりました。
今回使用した--function, --positionの他にも--regex, --set-cursorなど便利なオプションがまだあります。

開発にターミナルからのコマンド入力を多用するエンジニアにとって、abbrやaliasによる入力の省力化は長い目でみると生産性に大きな影響があると思います。
これからも日々シェル環境をカスタマイズしていきたいと思います。

Discussion