优化减少容器镜像大小 - 使用最小的包管理器

2024-06-20 14:38:14 浏览数 (1)

一、简介:最小的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

0 人点赞