fzfを使って現在起動中のDockerコンテナプロセスに簡単に接続するスクリプト

はじめに

ローカルで Docker を触ることが多いので、かんたんにコンテナプロセスの中にアタッチ ( 接続 ) できるようにスクリプトを作ってみました。

検証環境

1
2
3
4
5
6
7
8
$ uname -moi
arm64 unknown Darwin

$ bash -version | head -n 1
GNU bash, バージョン 5.2.15(1)-release (aarch64-apple-darwin22.1.0)

$ fzf --version
0.37.0 (brew)

スクリプト

docker-sh というスクリプト名で保存してください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/env bash
set -o errexit
set -o nounset

SH="bash"

type docker >/dev/null 2>&1 \
  || {
    echo "docker not found" >&2
    exit 1
  }
type fzf >/dev/null 2>&1 \
  || {
    echo "fzf not found" >&2
    exit 1
  }

HASH=$(
  docker \
    ps \
    --format 'table {{ .ID }}\t{{ .Image }}\t{{ .Command }}' \
    | fzf --header-lines=1 --select-1 --query="${1:-}" \
    | awk '{ print $1 }'
)

[[ -z ${HASH} ]] && exit 0

docker \
  exec -i -t \
  "${HASH}" "${SH}"

必要なもの ( ツール )

使い方・機能

引数なしで実行

1
$ docker-sh

fzf を使って、現在実行中のコンテナプロセスをインタラクティブに絞り込みできます。 任意のものに特定できたら ENTER を押します。 コンテナに対して docker exec -it が行われ、アタッチします。コンテナ内に接続します。

引数ありで実行

1
$ docker-sh fd

指定した文字列でフィルター済みのコンテナプロセスのみ表示します。 そこからさらに文字列を指定して絞り込みを行うことができます。

候補がコンテナしか見つからなかった場合

候補が 1 コンテナしか見つからなかった場合には、 fzf によるインタラクティブな操作は行われず、見つかったコンテナに接続します。

ひとこと

まあまあ便利。