tail my trail

作るのも使うのも、結局は、人なのだ

Docker for Mac 使っている場合の入力補完

f:id:uorat:20170131164247p:plain

tl:dr

Docker.app 内に bash_completion がバンドルされているので、それ使ってね。

背景

たいてい、以下のようなコマンドで completion 設定すると思うが、

curl -L https://raw.githubusercontent.com/docker/docker/master/contrib/completion/bash/docker > /etc/bash_completion.d/docker
curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
files=(docker-machine docker-machine-wrapper docker-machine-prompt)
for f in "${files[@]}"; do
  curl -L https://raw.githubusercontent.com/docker/machine/v$(docker-machine --version | tr -ds ',' ' ' | awk 'NR==1{print $(3)}')/contrib/completion/bash/$f.bash > `brew --prefix`/etc/bash_completion.d/$f
done

Docker for Mac の場合どうなんだろと気になって軽く調べた。

方法

またしてもググラビリティが低かったらしく、なかなかピンポイントな情報に出会えなかった。 結論、Docker for Mac の公式ドキュメントに書いてあるとおり、Docker.app 内にバンドルされているので、それを使おう。

Installing bash completion: Get started with Docker for Mac - Docker

If you are using bash completion, such as homebrew bash-completion on Mac bash completion scripts for the following commands may be found inside Docker.app, in the Contents/Resources/etc/ directory:

  • docker
  • docker-machine
  • docker-compose

homebrew で bash_completion 入れていれば、こんな感じで bash_completion.d/ ディレクトリに symlink 貼ってあげれば良い。

ln -s /Applications/Docker.app/Contents/Resources/etc/docker.bash-completion /usr/local/etc/bash_completion.d/docker
ln -s /Applications/Docker.app/Contents/Resources/etc/docker-machine.bash-completion /usr/local/etc/bash_completion.d/docker-machine
ln -s /Applications/Docker.app/Contents/Resources/etc/docker-compose.bash-completion /usr/local/etc/bash_completion.d/docker-compose

実行例

コマンド補完の例

$ docker [TAB]
attach     create     export     import     login      pause      push       run        stack      system     version
build      deploy     help       info       logout     plugin     rename     save       start      tag        volume
commit     diff       history    inspect    logs       port       restart    search     stats      top        wait
container  events     image      kill       network    ps         rm         secret     stop       unpause
cp         exec       images     load       node       pull       rmi        service    swarm      update

パラメーター補完の例

# 以下のコンテナがある状態で

$ docker ps -a
CONTAINER ID        IMAGE                           COMMAND                  CREATED              STATUS              PORTS                NAMES
dbd529912c30        uorat/ecs-demo-php-simple-app   "/usr/sbin/apache2..."   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp   hopeful_kalam

# "docker stop" まで打って TAB 押すと
$ docker stop [TAB]
↓
$ docker stop hopeful_kalam

# もう一つコンテナ立ち上げる
$ docker run -d -p81:80 [TAB]
alpine                                          uorat/ecs-demo-php-simple-app         ubuntu
alpine:latest                                   uorat/ecs-demo-php-simple-app:latest  ubuntu:12.04

$ docker run -d -p81:80 uorat/ecs-demo-php-simple-app
01a8b01975c07667574042bced6ba14d9056f87b43053b46e1abd6a29800fa6f

# 確認
$ docker ps
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS                NAMES
01a8b01975c0        uorat/ecs-demo-php-simple-app   "/usr/sbin/apache2..."   2 minutes ago       Up 2 minutes        0.0.0.0:81->80/tcp   elastic_chandrasekhar
dbd529912c30        uorat/ecs-demo-php-simple-app   "/usr/sbin/apache2..."   5 minutes ago       Up 5 minutes        0.0.0.0:80->80/tcp   hopeful_kalam

# "docker stop" まで打って TAB 押すと
$ docker stop [TAB]
elastic_chandrasekhar  hopeful_kalam

# 止める
$ docker stop [TAB]
elastic_chandrasekhar  hopeful_kalam
$ docker stop hopeful_kalam
hopeful_kalam

# 止まってるコンテナを再度立ち上げる
$ docker start [TAB]
↓
$ docker start hopeful_kalam ← ちゃんと止まってるコンテナだけフィルタリングされる

ちゃんちゃん。