【问题标题】:bash TAB completion does not work on centos 8bash TAB 完成在 centos 8 上不起作用
【发布时间】:2020-07-07 22:07:50
【问题描述】:

我在 docker 上运行一个 centos 8 发行版,我希望使用 dnf 包管理器完成 bash TAB。根据其他帖子,我的 docker 容器启动后,我执行了以下操作:

dnf clean all && rm -r /var/cache/dnf && dnf upgrade -y && dnf update -y

然后

dnf install bash-completion sqlite -y

之后,我重新启动了容器,但仍然没有完成 bash。我还尝试通过执行以下操作直接获取 bash 完成文件:

source /etc/profile.d/bash_completion.sh

但没有任何更好的效果。

你知道我做错了什么吗?

【问题讨论】:

    标签: centos centos8


    【解决方案1】:

    您不应该在 Docker 容器中需要 BASH Completion。您应该手动连接到 Linux 容器内的 shell 的唯一一次是排查容器中运行的进程异常行为的原因。事实上,一些容器设计建议甚至可能会建议您根本不要在基本操作系统中包含外壳!

    这对您不起作用的原因在于 Linux 容器的运行方式。 Container 只是一个由安装在主机操作系统上的内核管理的 namespaced 进程。该进程不能被修改或中断,否则容器将被销毁,因为该进程将被发送SIGTERM。当您尝试 source bash_completion.sh 脚本时,您正在尝试将新的配置参数传递给由 Docker 管理的现有命名空间进程。

    如果您真的想这样做,最好的方法是在原始 CentOS 8 基础映像的基础上创建一个新的 Docker 容器映像。然后从那里安装 bash 完成包并添加 echo 命令以将源代码行添加到用户的 .bashrc 文件中。

    编辑:

    关于在这个答案的 cmets 中询问 OP 的附加问题,我在下面添加了附加信息。

    为什么我不需要在容器中完成 bash

    您不需要在容器中完成 bash 的原因是容器并不意味着与外壳相连。 A 应该是在特定配置标准下运行的进程的单个实例。容器不是用来创建开发环境供你连接的,它们是用来在软件基础设施中运行进程和应用程序的。

    手动更新和安装包

    您提到启动容器时要做的第一件事就是安装软件包。这也让我感到震惊,因为您根本不应该手动与容器交互。这包括软件包安装。相反,您应该从旧的Base Image 生成新的容器映像,并向Dockerfile 添加额外的 RUN 语句以更新系统并安装这些所需的软件包。

    不敢相信这是不可能的

    如果您创建一个新的 Dockerfile,将其安装在基础镜像的新 layer 上,并生成一个新的容器镜像供您使用,这是可能的。但关键是,您不应该一开始就连接到 Docker 容器,甚至到了可能需要诸如 bash 完成之类的东西的地步!

    这里对容器和虚拟机之间的区别进行了很好的总结,可能有助于为您阐明其中的一些内容。简而言之,容器应该运行并且只运行进程。

    【讨论】:

    • 我很抱歉,但我不明白你的意思。也许我误解了。为什么我不需要在容器中完成 bash?我们通常在启动容器时做的第一件事是 1) 更新包 2) 安装一些包。因此,对于第 2 点)非常需要制表符完成。正因为如此,我不敢相信这是不可能的。
    • 我在底部标题为 EDIT 的部分中为我的答案添加了其他信息。您存在的基本误解是 Docker 容器的使用方式。一旦定义了容器规范并创建了容器,除非您需要对其中运行的应用程序进行故障排除,否则您永远不应连接到它。获得对容器的 shell 访问权限是很少见的。以至于想在其中安装 bash 补全功能很奇怪。我专业地处理这些东西,最多每两周执行一次容器。
    • 好的。我明白你的观点,我在某种程度上同意。但我仍然认为 bash 完成可能很有用。我知道使用 RUN 命令。但是,假设您使用了一个您不习惯的发行版(在我的例子中是 centos)。在编译将包含在 Dockerfile 中的一组 RUN 命令之前,您会很乐意直接在容器中挖掘它们。例如,给定的包在 ubuntu 或 centos(例如 NetCDF 库)下没有相同的名称。无论如何,感谢您的帮助和解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    相关资源
    最近更新 更多