如何修复 docker 容器自动完成

如何修复 docker 容器自动完成

我以前在很多机器上安装过 docker,自动完成功能总是开箱即用。奇怪的是,在一台新的 docker 安装中Ubuntu 20.04.2 LTS(焦点窝)虚拟机,当我按下 Tab 键时,什么都没有发生。我在我的 WSL 终端上尝试过,如果我输入sudo docker start g然后按 Tab 键,它会自动完成为sudo docker start gifted_hofstadter。然而,仅有的有这两个文件:

# ls /etc/bash_completion.d/
apport_completion  git-prompt

所以我不明白为什么我必须添加一个/etc/bash_completion.d/docker文件作为文章建议。如何用最少的更改来修复它?要清楚的是,常规的 bash 自动完成工作正常,该问题特定于 docker。谢谢。

更新:已安装吊舱并且存在相同的自动完成问题,尽管我认为它们没有关系。

我复制了这个docker.sh文件/etc/bash_completion.d/并重新启动 shell。现在 docker 命令自动完成,例如docker sta [tab]扩展为docker start。如果我这样做,docker start f它也会扩展为docker start f36da5e5a9a8即容器 ID。

但是,它不会扩展容器名称,例如frosty_tu当我这样做时docker start fro [tab]。虽然我很欣赏这个解决方案,但这是我不想到处寻找第三方脚本并更喜欢以前在新安装中看到的开箱即用体验的另一个原因。

升级后,“Ubuntu 22.04.1 LTS”上的问题仍然存在。

我正在使用Docker version 20.10.14, build a224086349已安装的snap

答案1

解决方案:(source正确的)脚本!

我问题中提到的docker脚本不是官方的。我刚注意到去年我docker在 下放置了一个文件(我称之为 )/etc/bash_completion.d/。该脚本有以下注释:

# To enable the completions either:
#  - place this file in /etc/bash_completion.d
#  or
#  - copy this file to e.g. ~/.docker-completion.sh and add the line
#    below to your .bashrc after bash completion features are loaded
#    . ~/.docker-completion.sh

因此我选择了第一个选项,但这不足以让自动完成功能正常工作。

今天试了一下source才看到效果。我不想弄乱我的主目录,所以我就把它留在那里,然后把它添加到我的.bashrc

source /etc/bash_completion.d/docker

很高兴地报告,现在容器名称自动完成功能可以按预期工作了!感谢@Artur Meinild 提醒我再次查看此内容。

获取正确的脚本

脚本分发折断只是一个脚本的符号链接,根据我的经验,它不会完成这项工作:

/usr/share/bash-completion/completions/docker -> /snap/snapd/current/usr/lib/snapd/complete.sh

docker从以前的 Ubuntu WSL 安装(其中自动完成功能有效)复制了上面引用的脚本,但是有一个类似的在 docker 的 github 存储库中。如果你从 snap 安装了 docker,我建议你下载并尝试一下。

自动完成容器 ID

正如脚本中所述,如果您还想自动完成容器 ID,只需设置环境变量:

DOCKER_COMPLETION_SHOW_CONTAINER_IDS=yes

这可以在同一个 shell 上按需完成,或者您也可以~/.bashrc像我一样将其添加到您的 shell 中。

答案2

我的解决方案是这样的:

  1. 如果你没有,请下载 bash-completion 包:sudo apt-get install bash-completion
  2. 从以下位置下载 docker bash 补全此网址(看起来它是最新的):sudo curl https://raw.githubusercontent.com/docker/cli/master/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
  3. 如果你使用非 root 用户,则重要:将当前用户(例如ubuntu)添加到docker组:sudo usermod -aG docker ubuntu
  4. 注销并重新登录。

第 2 步是必需的,因为脚本中提到:

注意:目前,如果 docker 守护进程未绑定到默认通信端口/套接字,则补全将不起作用。如果 docker 守护进程使用 unix 套接字进行通信您的用户必须有权访问套接字以使完成部分能够正常运作。

答案3

GitHub 不提供随时可用的脚本,而是提供包含所需脚本的复杂 JSON 负载。因此,您需要通过工具wget(或者curl如果您愿意)传输输出jq,以便对其进行解析。

对我来说实际工作的脚本.bashrc如下所示:

if hash docker &> /dev/null; then
  if [[ ! -f /etc/bash_completion.d/docker.sh ]]; then
    wget -q -O - https://github.com/docker/cli/blob/master/contrib/completion/bash/docker | jq -r .payload.blob.rawLines[] | sudo tee /etc/bash_completion.d/docker.sh &> /dev/null
    sudo chmod go+r /etc/bash_completion.d/docker.sh &> /dev/null
  fi
  source /etc/bash_completion.d/docker.sh
  export DOCKER_COMPLETION_SHOW_CONTAINER_IDS=yes
fi

DOCKER_COMPLETION_SHOW_CONTAINER_IDS如果您不希望kubectl完成包含容器 ID,则可以跳过有关变量的行。

如果由于任何原因你需要“刷新” kubectl 的 bash 补全,你只需要删除当前脚本并重新资源.bashrc(或你已将上述代码放入的任何文件):

sudo rm -f /etc/bash_completion.d/docker.sh
source ~/.bashrc

当然,如果您还没有安装该bash-completion包,您需要安装它。apt

我根据上述答案以及我自己的一些搜索和测试修改了这个答案。

答案4

就我而言,我必须启用可编程完成功能.~/.bashrc(或在最底部添加)

# enable programmable completion features (you don't need to enable 
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).

if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi

相关内容