0

我在 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

但没有任何更好的效果。

你知道我做错了什么吗?

4

1 回答 1

1

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

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

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

编辑:

关于在此答案的评论中向 OP 提出的其他问题,我在下面添加了其他信息。

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

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

手动更新和安装包

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

不敢相信这是不可能的

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

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

于 2020-03-28T05:03:12.797 回答