fzfでDockerを快適にする。
fzfというツールは
標準入力から受け取ったリストから対話的に選択してその結果を標準出力に出力することができます。
これをdockerと組み合わせるとコンテナやイメージをコマンドラインで選択してrunやattachなどができます。
・インストールは以下を参考にしました。
第504回 インタラクティブフィルター「fzf」の活用:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社
・docker用シェル関数は以下を参考にしました。
dockerコンテナの起動・停止をちょっと楽にするシェル関数 - Qiita
作業環境
・Ubuntu18.04.1
・Docker-ce 18.06.1
作業内容
fzfのインストール
インストーラをダウンロード
git clone https://github.com/junegunn/fzf.git ~/.fzf
インストール。すべてyesにしました。
cd .fzf ./install
.bashrcを読み込めば起動できます。
source ~/.bashrc
docker用シェル関数
シェルスクリプトを作って、sourceすれば以下のコマンドでdockerを起動できる
source docker_fzf.sh
docker-run | イメージを選択して起動できる |
---|---|
docker-run-x11 | イメージを選択して起動できる。ホストのGUIを利用できる |
docker-commit [image_name] | 引数にイメージの名前を設定して起動中のコンテナをcommitできる |
docker-copy [file_name] | 起動中のコンテナを選択して、引数に指定したファイルをコピーできる |
docker-attach | 起動しているコンテナを選択してにattachできる |
docker_fzf.sh
#!/bin/bash docker-run() { local container container="$(docker image ls | sed -e '1d' | fzf --height 40% --reverse | awk -v 'OFS=:' '{print $1,$2}')" if [ -n "${container}" ]; then echo "runing container from ${container} ..." docker container run -it --rm ${container} fi } docker-run-x11() { local container container="$(docker image ls | sed -e '1d' | fzf --height 40% --reverse | awk -v 'OFS=:' '{print $1,$2}')" if [ -n "${container}" ]; then echo "runing container from ${container} ..." xhost + docker container run -it --rm \ -e DISPLAY=$DISPLAY \ -v /tmp/.X11-unix:/tmp/.X11-unix \ ${container} fi } docker-commit() { if [ $# -ne 1 ]; then echo "指定された引数は$#個です。" 1>&2 echo "実行するには引数に「イメージ名」が必要です。" 1>&2 exit 0 fi local container container="$(docker container ls -a -f status=running | sed -e '1d' | fzf --height 40% --reverse | awk '{print $1}')" if [ -n "${container}" ]; then echo "committing container to $1 ..." docker container commit ${container} $1 fi } docker-copy(){ if [ $# -ne 1 ]; then echo "指定された引数は$#個です。" 1>&2 echo "実行するには引数に「コピーするソースのパス」が必要です。" 1>&2 exit 0 fi local container container="$(docker container ls -a -f status=running | sed -e '1d' | fzf --height 40% --reverse | awk '{print $1}')" if [ -n "${container}" ]; then echo "moving $1 to container ..." docker container cp $1 ${container}:/tmp/ fi } docker-attach() { local container container="$(docker container ls -a -f status=running | sed -e '1d' | fzf --height 40% --reverse | awk '{print $1}')" if [ -n "${container}" ]; then echo "attaching container ..." docker container attach ${container} fi }