我在 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 作为终端。
知道为什么它不起作用或者如何让它工作吗?
好的,我找到了 - 我只需要在
source /etc/bash_completion
之前或之后做一个 source <(kubectl completion bash)
。
检查.bashrc
启用可编程完成功能(您不需要启用 如果它已经在 /etc/bash.bashrc 和 /etc/profile 中启用的话 来源/etc/bash.bashrc)。
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
. /etc/bash_completion
fi
在 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。
我整合了 Ubuntu 22.04 的两条热门评论
编辑 ~/.bashrc 并添加
source /etc/bash_completion
之前
source <(kubectl completion bash)
alias k=kubectl
complete -o default -F __start_kubectl k
# 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)