Kinaconの技術ブログ

Ubuntuはじめました。

fzfでDockerを快適にする。

f:id:m-oota-711:20180824075049j:plain

fzfというツールは
標準入力から受け取ったリストから対話的に選択してその結果を標準出力に出力することができます。

これをdockerと組み合わせるとコンテナやイメージをコマンドラインで選択してrunやattachなどができます。



f:id:m-oota-711:20190215180404g:plain

・インストールは以下を参考にしました。
第504回 インタラクティブフィルター「fzf」の活用:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社

・docker用シェル関数は以下を参考にしました。
dockerコンテナの起動・停止をちょっと楽にするシェル関数 - Qiita




作業環境

・Ubuntu18.04.1
f:id:m-oota-711:20181015133547p:plain

・Docker-ce 18.06.1
f:id:m-oota-711:20181015133732p:plain





作業内容

fzfのインストール

インストーラをダウンロード

git clone https://github.com/junegunn/fzf.git ~/.fzf


f:id:m-oota-711:20181024212359p:plain


インストール。すべてyesにしました。

cd .fzf
./install

f:id:m-oota-711:20181024212501p:plain



.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
}