1. 程式人生 > 實用技巧 >Docker容器中apt install命令無法補全

Docker容器中apt install命令無法補全

太長不看

先說結論

# assume you are root in container
rm /etc/apt/apt.conf.d/docker-claen
sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
apt update
apt install -y bash-completion
vi /etc/bash.bashrc
# enable bash completion in interactive shells
source /etc/bash.bashrc

問題描述

最近需要在一個高效能Linux伺服器上的Docker容器內進行遠端開發
視覺化已使用X11轉發解決,但Docker容器使用apt install無法自動補全package名稱
正常伺服器輸入

$ sudo apt install python3-matp<TAB>

會自動補全

$ sudo apt install python3-matplotlib

而Docker容器內使用ubuntu:18.04映象換源後按tab沒反應

分析解決

網上大多數說法是缺少bash-completion
通過apt install bash-completion安裝後開啟

# vi /etc/bash.bashrc

# enable bash completion in interactive shells
if ! shopt -oq posix; then
 if [ -f /usr/share/bash-completion/bash_completion ]; then
   . /usr/share/bash-completion/bash_completion
 elif [ -f /etc/bash_completion ]; then
   . /etc/bash_completion
 fi
fi

此時已經可以補全基本語法
apt inst<TAB> -> apt install

仍然無法補全包名,隨後嘗試安裝重新安裝
sudo apt-get install --reinstall bash-completion
無果
嘗試安裝auto-complete-el
sudo apt-get install auto-complete-el
無果

最終懷疑是apt配置問題導致bash-completion無法搜尋包名
對比正常ubuntu桌面系統後,發現docker映象的apt有幾處不同

正常系統

ubuntu@ubuntu:/etc/apt/apt.conf.d$ ll
total 64
drwxr-xr-x 2 root root 4096 Jun  4  2020 ./
drwxr-xr-x 6 root root 4096 Jun  4  2020 ../
-rw-rw-r-- 1 root root   49 Jun  4  2020 00aptitude
-rw-rw-r-- 1 root root   40 Jun  4  2020 00trustcdrom
-rw-r--r-- 1 root root  861 Jan 19  2019 01autoremove
-r--r--r-- 1 root root 1494 Jun  4  2020 01autoremove-kernels
-rw-r--r-- 1 root root   42 Apr 14  2016 01-vendor-ubuntu
-rw-r--r-- 1 root root  168 Jun  4  2020 10periodic
-rw-r--r-- 1 root root  108 Dec  7  2018 15update-stamp
-rw-r--r-- 1 root root   85 Dec  7  2018 20archive
-rw-r--r-- 1 root root  168 Jun  4  2020 20auto-upgrades
-rw-r--r-- 1 root root  243 Dec 16  2009 20dbus
-rw-r--r-- 1 root root 1432 Apr 18  2016 50appstream
-rw-r--r-- 1 root root 2656 Feb 27  2019 50unattended-upgrades
-rw-r--r-- 1 root root  182 Nov 11  2015 70debconf
-rw-r--r-- 1 root root  305 Dec  7  2018 99update-notifier

Docker容器

root@d693b6733c01:/etc/apt/apt.conf.d# ll
total 40
drwxr-xr-x 1 root root 4096 Nov 26 06:25 ./
drwxr-xr-x 1 root root 4096 Dec 12 14:56 ../
-rw-r--r-- 1 root root   92 Apr  9  2020 01-vendor-ubuntu
-rw-r--r-- 1 root root  630 Apr  9  2020 01autoremove
-r--r--r-- 1 root root  623 Nov  6 09:21 01autoremove-kernels
-rw-r--r-- 1 root root  182 Aug  3  2019 70debconf
-rw-r--r-- 1 root root   44 Nov 26 06:25 docker-autoremove-suggests
-rw-r--r-- 1 root root  318 Nov 26 06:25 docker-clean
-rw-r--r-- 1 root root   70 Nov 26 06:25 docker-gzip-indexes
-rw-r--r-- 1 root root   27 Nov 26 06:25 docker-no-languages

可以看出容器內多了幾個docker開頭的檔案,其中docker-clean負責清除apt快取減小容器體積

DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };
APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };
Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";

原因找到了!刪除docker-clean後在進行apt update操作重建本地快取,命令補全恢復正常!

參考

enabling auto completion for apt-get install in docker (ubuntu 14.04) - Ask Ubuntu