pecoでdocker exec を快適にする

Dockerを使って開発していると、docker execすることが結構あると思いますが、地味に面倒なのでpecoを使って簡単に出来るようにしてみました。

pecoを使う前はこんな感じでdocker exec していると思います。

pecoを使うとこんな感じになります。

1文字打つだけでコンテナに入れます、早くて楽で良いですよね。

それでは設定していきたいと思います。
まずpecoをインストールします。
※今回はbrewを前提にしてますので、brewが使えない場合は別途brewをインストールしてください。(windowsの人はbrewないので手順変わります、ごめんなさい)

brew install peco

これだけでpecoが使えるようになります。pecoは別のコマンドの結果を受け取って選択できるようにしてくれる、そして選択した結果だけを返してくれるコマンドになります。

pecoが使えるようになったので、次のステップに行きます。
docker exec する際にコンテナIDが必要になるので、docker ps の結果からpecoで選択した行のコンテナIDを取得する。をやりたいと思います。

まず「docker ps の結果からpecoで選択した行」までのところは以下のコードになります。docker ps の結果を |(パイプ)でpecoに渡して上げればOKです

$ docker ps | peco
dce26af62758   sample-ph3-quizy_app   "docker-php-entrypoi…"   3 days ago   Up 15 minutes   9000/tcp                            sample-ph3-quizy_app_1

こうすると選択した行だけの情報が取得できるようになります。
次は「docker ps の結果からpecoで選択した行のコンテナIDを取得する」までやります。
docker psの結果はコンテナIDの他に、イメージ コマンド などの情報も一緒に取得しちゃうので、コンテナIDだけ抜き出すという処理を書きます。
awkというコマンドを使って、スペース区切りの文字列の1つ目を取得。とすることでコンテナIDが取得で聞きます。コードは以下のようになります。

$ docker ps | peco | awk "{print \$1}"
dce26af62758

欲しい情報が取れたので、あとはdocker exec に上手いこと渡して上げれば行けます。
docker exec コマンドを書いて、コンテナIDが入って欲しい所に先程のコマンドを入れてみます。コンテナIDを取得する所が先に動いてほしいので$()で囲って上げればOKです。コードは以下のようになります

$ docker exec -it $(docker ps | peco | awk "{print \$1}") bash
root@dce26af62758:/work/backend# 

これで対象のコンテナを選択するだけで入れるようになりました。
毎回この長いコマンド打つのが面倒なので、alias(windowsの人は手順変わります、ごめんなさい)を設定します。

先程作った長いコマンドを、dというコマンドで登録して、d と打つだけでコンテナに入れるようにします。

$ alias d='docker exec -it $(docker ps |peco|awk "{print \$1}") bash'
$ d
root@dce26af62758:/work/backend# exit
$ d
root@d5aeefadd2b9:/#

これでdコマンドでコンテナに入れるようになりました。
ですが、ターミナルを新しく起動するとdコマンドが使えなくなっちゃいます。
これだと毎回aliasコマンドを実行しないといけないので、これも設定していきます。
設定としては、ターミナル起動時に自動的にaliasコマンドが実行されるようにします。

bash、zshなどシェルによって設定対象のファイルが変わってくるので、自分が使っているシェルの種類を確認します

$ echo $SHELL
/bin/bash    # bashの場合
/bin/zsh     # zshの場合

これで自分が使っているシェルの種類がわかるので、シェルに合わせた設定ファイルを修正します。(ファイルが存在しない場合もありますが、vi で新規作成しちゃって大丈夫です)

# bashの場合
vi ~/.bashrc

# zshの場合
vi ~/.zshrc

上記ファイルにaliasコマンドを書きます。

alias d='docker exec -it $(docker ps |peco|awk "{print \$1}") bash'

これでターミナル新しく起動しても、dコマンドが利用できるようになっているはずです!快適なDockerライフをどうぞ!!

_φ(・_・
その他Docker関係で、aliasに登録しておくと良さそうなコマンド書いておきます

alias d='docker exec -it $(docker ps | peco | awk "{print \$1}") bash'
alias ds='docker stop $(docker ps | peco | awk "{print \$1}")'
alias dl='docker log $(docker ps | peco | awk "{print \$1}")'
alias dp='docker ps'
alias dr='docker run $1'
alias dcu='docker-compose up -d'
alias dcb='docker-compose build'
alias dcbn='docker-compose build --no-cache'
alias dcl='docker-compose logs'

# docker-compose downとは違う、動いてるコンテナをとりあえず全部止める
alias dcd='docker stop $(docker ps -q)'

# bashが使えないコンテナの場合はこちらのコマンドを使う
alias dsh='docker exec -it $(docker ps | peco | awk "{print \$1}") sh'