太長不看
先說結論
# assume you are root in container
rm /etc/apt/apt.conf.d/docker-clean
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