Docker02:Docker核心技术探索(7)在mydocker的容器中添加yum支持

为了在通过mydocker.sh创建的容器中添加yum的支持,遇到了不少的问题。在描述这些问题以及解决的办法之前,我们有必要讲一下为什么一定要添加yum的支持。

我们的容器中的虚拟系统,是从/bin/bash这个命令的支持开始的,每个命令包括which ,file, ldd , stace等在内的支持,都是通过ldd和strace查找缺少的文件和动态库,然后从宿主系统中拷贝到容器系统中的办法完成的,效率不高,而且很难完全满足各种依赖关系,能够正常运行,其实潜藏了一定的风险,因为不可能完全覆盖所有运行路径。

有了这种认识之后,想到引入yum软件包安装管理程序就是水到渠成的事情。这就有几项工作需要做:

1.让容器中的系统能够正常启动yum程序的执行。

实际上是解决yum的python环境和/etc/yum.conf配置环境的问题。

容器中的系统是很不完整的,很多地方也无法满足一致性。一个问题是yum虽然能够链接到源服务器,但是在我们的容器中的虚拟系统中,缺乏CentOS版本相关的信息。主要是/etc/yum.repos.d/目录中的CentOS-Base.repo 等文件中使用了两个变量$releasever和$basearch无法赋值。 其中$releasever明确为7,因为我们的镜像的所有文件来源为CentOS7系统,$basearch的来源为命令arch的输出结果,为此,我们来解决这两个变量的赋值问题。

(a)执行命令:

为了一劳永逸,直接修改镜像中的文件。在镜像目录的etc/yum.repos.d/目录中执行以下命令。 在/etc/yum.conf中也有$releasever出现。

1  sudo sed -i -r 's/\$releasever/7/g'

这就解决了$releasever的赋值问题。

(b)在宿主系统中找到arch命令,添加到我们的镜像目录中去,从而为我们的容器提供arch命令的支持。

1 15:56:29 root@abc /etc/yum.repos.d#arch 2 x86_64

这样解决了$basearch的赋值问题。

(3)如果还有问题,则可能是在这两个变量没赋值之前执行yum命令的映像。比如/var/cache/yum目录中可能出现$releasever变量。

yum似乎还是有问题待解决。

 

2.容器中的系统其实没有安装任何软件包,需要解决软件包在管理体系中的一致性问题。

虽然其中一些基础软件包的动态库和相关的文件都已经存在于容器中了,但是在软件包管理体系内并不认可,也就是没有接受软件包管理体系的监管,即rpm体系和yum体系的监管。

简单的说,就是rpm或rpmdb或yum的数据库中没有这些软件包的记录。这些记录存在于/var/lib/yum, /var/lib/rpm, /var/cache/yum,/var/cache/rpm等目录中。

昨天的时候,犯了一个错误,想当然的将宿主系统的这些目录完全复制到容器中了。

这样在软件rpm和yum的管理体系中,都已经“认可”了这些软件包的存在。但是正如前面所叙,很多软件的真正的“文件”在容器中并不完整,甚至根本不存在。在拷贝数据库记录之前,一些软件包是有其实无其名,现在拷贝数据库记录之后,很多软件软件包出现了有其名无其实的问题。

必须先使用rpm -ivh --nodeps强行安装缺少的软件包。

3.容器中的系统对python的支持还不完整。

yum的正常执行依赖于python的很多软件包。经过调查发现容器中至少缺少一个python-request-xxxx的软件包,造成yum update和yum install无法正常工作。

yum update更新出错的原因,主要是缺少python以及更基础的glib, libc等软件包。在通过CentOS  ISO镜像通过rpm -ivh --nodeps 强行安装了这些“基础”包和python的包之后,yum update更新成功,后续各种yum install也执行成功。

至此,我们的容器中已经提供了正常的yum软件包管理体系,后面可通过yum正常渠道去安装所需要的软件包。

猜你喜欢

转载自www.cnblogs.com/coe2coe/p/8889255.html