同僚がPythonで作ったOSSをGoに移植してみた。
$ dkl -h
Usage of dkl:
-d -docker
list docker containers and exec selected container.
-k -kubernetes
list pods and exec selected pod.
-v -version
print version information and quit.
TL;DR
- Docker ContainerやKubenetes Podにログインするには、一度起動中のContainer(Pod)を一覧する必要がある
- さらに名前をコピーして
docker(kubectl) exec
コマンドを実行する必要がある
- さらに名前をコピーして
dtt
コマンドは1回のコマンドで一覧を表示、exec
コマンドで選択したContainer(Pod)にアタッチする。- Pythonで作られている。
- Goで書き直したのが
dkl
コマンド promptui
を使ったので一覧からの選択部分はリッチ
dklの概要
Dockerコンテナにログインしたいとき、大抵はdocker ps
コマンドを実行し、コンテナの名前を確認し、docker exec
コマンドを実行することになる。
これは、Kubernetes上のPodにアタッチするときもほぼ同様の操作になる。
dkl
コマンドは上記をラクするために同僚がPythonで作っていたツールをGoで書き直したものだ。
https://github.com/ymizushi/dtt
https://github.com/budougumi0617/dkl
dkl
コマンドを使うと、Dockerコンテナ(あるいはKubernetes Pod)一覧を表示し、選択したコンテナにアタッチすることができる。
インストールにはBrew
を利用できる。
$ brew install budougum0617/tap/dkl
2019/09/28時点の使い方は次の通り。
$ dkl -h
Usage of dkl:
-d list docker containers and exec selected container.
-docker
list docker containers and exec selected container.
-k list pods and exec selected pod.
-kubernetes
list pods and exec selected pod.
-v print version information and quit.
-version
print version information and quit.
作り込んていないので、一覧できる情報は少ないが、dkl
コマンドを引数なしで動かすと、実行中のコンテナ一覧を表示する。
ひとまず名前とImage情報を表示している。
$ dkl
Use the arrow keys to navigate: ↓ ↑ → ← and / toggles search
Docker running...?
🐋 /mysql (mysql:5.7, sha256:98455b9624a96e32b353297bb312913b6bbd62ac195cea2c7dd477209ba572d6)
/mysql8 (mysql:8.0, sha256:91dadee7afeebe274c51104d572ab6a2dc0ae97473f71afc57fbfd48c0ceb8aa)
--------- Image ----------
Name: ["/mysql"]
Image: mysql:5.7
ImageID: sha256:98455b9624a96e32b353297bb312913b6bbd62ac195cea2c7dd477209ba572d6
この中から選択したコンテナにdocker exec
コマンドを実行してコンテナへアタッチ、インタラクティブシェルを開始する。
KubernetesのPodの場合は以下のような情報を表示する。
dkl -k
Use the arrow keys to navigate: ↓ ↑ → ← and / toggles search
Kubernetes pod running...?
⎈ nginx (default Running)
coredns-5c98db65d4-fxttt (kube-system Running)
coredns-5c98db65d4-lv9gh (kube-system Running)
etcd-minikube (kube-system Running)
kube-addon-manager-minikube (kube-system Running)
kube-apiserver-minikube (kube-system Running)
kube-controller-manager-minikube (kube-system Running)
kube-proxy-kchl6 (kube-system Running)
kube-scheduler-minikube (kube-system Running)
storage-provisioner (kube-system Running)
--------- Pod ----------
Name: "nginx"
Namespacege: default
Status: Running
Age: 114h51m50.205832s
こちらも同様に選択したPodにkubectl exec
コマンドを実行してアタッチする。
対象を選択する部分はmanifoldco/promptui
パッケージをそのまま利用しているので、絞り込み検索もできる。
技術書典の準備の隙間でやっていたので、雑なところもあるが、ひとまずちゃんと動くものができてよかった。
特徴
機能的には前述の機能しかない。Goで実装してよかった特徴としては以下があげられる。
- シングルバイナリ・マルチプラットフォーム提供が簡単
- Go Releaserを使ったので、デプロイが簡単
manifoldco/promptui
を使ったのでインタラクティブな絞り込みが簡単にできた- DockerもKubernetesもGo SDKが公開されているので、APIの呼び出しが簡単
不出来な点としては、実装を省略するため、ログインはdocker
(kubectl
)コマンドを外部プロセスとして実行している。
本当はSDKのexec
用のAPIを利用したかったが、時間がたりなかった。
終わりに
ひととりカタチにはなったのだが、あまり作り込めていない。 具体的には、思いつくところだけで以下のような改善点がある。
- 構造化が雑
- testableではない
Pod
のAge
で表示している時間が分かりにくい(標準パッケージだとtime.Duration
をいい感じに表示できない)- 実行時にアタッチして呼び出す実行コマンドの指定に
ls -la
などが指定できない - ログインでは外部コマンドを実行しているので、
docker
、kubectl
コマンドに依存している
他にも作りたいOSSがあったり、来月はHacktoberfest
もあるのですぐにはできないが、引き続きカイゼンしていきたい。