kubectl bash 补全在 ubuntu docker 容器中不起作用

问题描述 投票:0回答:5

我在 Mac 上运行的 docker 容器中使用 kubectl。我已经成功配置了 bash 补全,让 kubectl 在 Mac 上工作,但是,它在 docker 容器中不起作用。我总是得到

bash: _get_comp_words_by_ref: command not found

docker 镜像基于

ubuntu:16.04
并且 kubectl 通过该行安装(来自 dockerfile 的片段)

curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && \
mv kubectl /usr/local/bin

echo $BASH_VERSION
给了我
4.3.48(1)-release
,并且根据apt,
bash-completion
软件包已安装。

我使用 iTerm2 作为终端。

知道为什么它不起作用或者如何让它工作吗?

bash docker autocomplete kubernetes kubectl
5个回答
57
投票

好的,我找到了 - 我只需要在

source /etc/bash_completion
之前或之后做一个
source <(kubectl completion bash)


2
投票

检查.bashrc

启用可编程完成功能(您不需要启用 如果它已经在 /etc/bash.bashrc 和 /etc/profile 中启用的话 来源/etc/bash.bashrc)。

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

1
投票

在 macOS 上执行的 Linux 容器会创建一个单独的环境并 是的,它看起来像 macOS shell 中的线程,但事实并非如此。壳牌历史, 属性、功能则是另一回事。 此外,如果容器没有安装持久卷,所有这些参数都将被传输,并且不会在容器重新启动后继续存在。

使 bash 完成两者的方法 - macOS 和 Ubuntu Linux 类似,但需要采取不同的步骤:

macOS 端 - 永久支持 kubectl bash 补全:

使用自制软件安装支持:

brew install bash-completion
kubectl completion bash > $(brew --prefix)/etc/bash_completion.d/kubectl

Ubuntu 容器内置 kubectl 和 bash 补全支持的方法:

您可以调整这组命令并在镜像准备期间在 Dockerfile 中使用它:

apt-get update && apt-get install -y apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubectl
echo 'source <(kubectl completion bash)' >> ~/.bashrc

如果之后您或用户在正在运行的容器中执行 /bin/bash 那么您应该可以完成工作。

docker exec -it docker_image_id /bin/bash

这将启动 bash shell 并完成 bash。


0
投票

我整合了 Ubuntu 22.04 的两条热门评论

编辑 ~/.bashrc 并添加

source /etc/bash_completion

之前

source <(kubectl completion bash)
alias k=kubectl
complete -o default -F __start_kubectl k

0
投票
# 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 ! 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

alias k='kubectl'
complete -F __start_kubectl k

alias kp='kubectl get pods --all-namespaces -o=wide'

source <(kubectl completion bash)
© www.soinside.com 2019 - 2024. All rights reserved.