一、简介:最小的rpm包管理器-godnf
在容器镜像场景,alpine总是让人着迷,拥有最小的包管理器apk,使得alpine的最小容器镜像大小可以只要7M, 大大的减小了基于此做的容器镜像大小。但是alpine使用 musl libc,而不是 glibc 作为 C 库,可能会影响到一些应用的兼容性,如 NVIDIA 的官方 CUDA 驱动和工具包是针对基于 glibc进行构建和测试,musl libc 存在兼容性问题。如果强行安装GNU glibc,又非常麻烦。
反观,服务器操作系统的主流发行商redhat, openSuse, 国内的Huawei OpenEuler,Tencent OpenCloudOS, 在服务器领域的应用兼容性上没有问题,但是又因为包管理器dnf过大,导致基础镜像已经很大。
Redhat:
name | size | Desc |
---|---|---|
ubi9-minimal | 98.7MB | microdnf package manager |
ubi9 | 230M | dnf package manager |
Alpine:
name | size | Desc |
---|---|---|
alpine | 7.8M | apk package manager |
为什么dnf包管理器比apk要大很多了,主要因为dnf的功能复杂,引入的动态库非常多;对dnf做功能裁剪的话,目前来看非常困难。
那为什么不开发个简化的dnf工具呢,而且是静态编译,不需要的时候直接删除,不需要考虑复杂的软件包依赖。因此godnf应运而生。
godnf是基于go语言开发,目前已经有rpm的go 库,基于这个库,我们增加软件包依赖解析和下载,就可以完成基础的rpm软件包安装。重点:这个godnf程序只有4.5M,非常的小。
代码链接:https://github.com/docker-toolkits/godnf
代码语言:javascript复制NAME:
godnf - package manager use go
USAGE:
godnf [global options] command [command options] [arguments...]
VERSION:
v1.0.0
COMMANDS:
install install rpm packages
list list rpm packages
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--loglevel value set log level: 0-DEBUG, 1-INFO, 2-WARN, 3-ERROR, default:3 (default: 3)
--help, -h show help
--version, -v print the version
二、使用
基于godnf redhat、OpenCloudOS的软件源,已经构建两个基础镜像:
镜像:godnf
redhat/openCloudOS repo
static busybox
name | repo | size | usage |
---|---|---|---|
godnf/ocs23 | openCloudOS Stream 23 | 5.92M | docker pull godnf/ocs23:latest |
godnf/ubi9 | redhat ubi9 | 5.92M | docker pull godnf/ubi9:latest |
我们可以基于基础镜像构建继续构建。
1> 构建python的容器镜像
Dockerfile
代码语言:javascript复制FROM godnf/ubi9:latest
RUN godnf install python
CMD ["/bin/python"]
2> 执行构建:
代码语言:javascript复制docker build -t godnf-ubi9-python .
3> 运行容器
代码语言:javascript复制[root@localhost tst]# docker run -it godnf-ubi9-python
Python 3.9.18 (main, Jan 24 2024, 00:00:00)
[GCC 11.4.1 20231218 (Red Hat 11.4.1-3)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
我们对比一下容器大小:
分别使用redhat/ubi9-minimal 和 godnf/ubi9作为FROM镜像构建python,可以看到redhat/ubi9-minimal microdnf的构建出来的容器镜像几乎大了一倍。
代码语言:javascript复制REPOSITORY TAG IMAGE ID CREATED SIZE
godnf-ubi9-python latest 804d9356672a 2 minutes ago 89MB
redhat-python latest 497e42bb657f 4 days ago 151MB