1. 程式人生 > >我的docker隨筆6:docker命令自動補齊

我的docker隨筆6:docker命令自動補齊

背景

在筆者自己製作並安裝的ubuntu16.04系統上(參考筆者網站關於debootstrap的文章),無法使用docker自動補齊功能,即輸入docker命令後,按Tab鍵無法列出子命令(或引數)的候選項。於是在網上找了些資料,實現了這個功能,形成本文。

機制

Linux系統許多命令都會提供該命令自身的命令補齊指令碼,在安裝命令時會自動安裝自動補齊指令碼——如果有的話。該機制在Linux中被稱為bash-complete。在/usr/share/bash-completion/completions目錄下有許多命令自動補齊的指令碼,可自行查閱。與docker有關的,有2個:docker和docker-compose。如下:

# ls  /usr/share/bash-completion/completions/docker*
/usr/share/bash-completion/completions/docker  /usr/share/bash-completion/completions/docker-compose

自動補齊需要依賴工具bash-complete,如果沒有,則需要手動安裝,命令如下:

sudo apt-get install -y bash-completion

安裝成功後,得到檔案為 /usr/share/bash-completion/bash_completion,如果沒有這個檔案,則說明系統上沒有安裝這個工具。

實踐

讓配置指令碼生效的方法是執行source xxx命令,先執行source /usr/share/bash-completion/completions/docker,再輸入docker,然後按2次Tab鍵,提示錯誤如下:

docker bash: _get_comp_words_by_ref: command not found
bash: [: : integer expression expected
bash: [: : integer expression expected
bash: [: : integer expression expected
bash: _get_comp_words_by_ref: command
not found
bash: [: : integer expression expected bash: [: : integer expression expected bash: [: : integer expression expected

注:第一行的docker,實際是輸入的命令,其它是按Tab鍵的輸出資訊。

前面已經安裝了bash_completion,於是想到執行

source /usr/share/bash-completion/bash_completion

再次嘗試,發現可以正常列出docker的子命令,示例如下:

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

試試docker-compose命令,如下:

# docker-compose  (注:此處按2次Tab鍵)
build    config   down     exec     kill     pause    ps       push     rm       scale    stop     up       
bundle   create   events   help     logs     port     pull     restart  run      start    unpause  version 

嘗試容器名稱的自動補齊功能:

# docker logs latelee- (注:輸入latelee-後按2次Tab鍵)
latelee-wordpress    latelee-apache     latelee-mysql        
latelee-zentao  latelee-gitlab  latelee-jenkins 

至此,docker、docker-compose自動補齊功能已完成,重啟系統後,也能進行自動補齊。類似地,對於k8s,也有相應的命令補齊功能,不過k8s是另外的話題了。

小結

Linux的大量命令讓人望而生畏,但如果掌握了Tab鍵功能,則可減少大量命令輸入工作,提高效率。

李遲 2017.7.3 晚