fish+pecoでDockerのイメージ、コンテナを簡単に選択する
イメージIDやコンテナIDの指定が必要なDockerのサブコマンドを使うたびに、事前にdocker images
やdocker ps
を実行してIDをコピーして貼り付けるのは面倒ですよね。
pecoとghqを組み合わせたGitリポジトリの選択や、gitコマンドとpecoを組み合わせたブランチの選択の方法はネットに多くの記事がありますが、Dockerのイメージやコンテナの選択にpecoを使用する例については情報が少ないので、何か良い方法がないか考えてみました。
その結果、良い方法が見つかりましたのでこちらのリポジトリに公開しました。
どんなdockerコマンドとも組み合わせられます
イメージID、コンテナIDを指定する任意のdockerコマンドで、image
やcontainer
と入力してスペースキーを押すと、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コマンドのパラメーターとして入力された時のみ置換するようにしています。
abbr -a container --position anywhere -f select_docker_container
abbr -a image --position anywhere -f select_docker_image
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