使用 Docker 构建 yum/apt 离线源
k8s技术圈
共 4626字,需浏览 10分钟
·
2021-09-10 12:19
首先由于各个包之间的依赖关系比较复杂,并不能将它们直接下载下来; 其次即便下载下来之后也无法直接通过 yum/apt 的方式安装指定的软件包,虽然也可以使用 scp 的方式将这些包复制到部署节点,通过 rpm 或 dpkg 的方式来安装上,但这样并不是很优雅,而且通用性能也不是很好; 最后需要适配的 Linux 发行版和包管理器种类也有多种,而且有些包的包名或者版本号在不同的包管理之间也相差甚大,无法做到统一管理。
在构建容器内配置 yum/apt 源,安装构建时需要工具; 生成系统内的 rpm/deb 包的列表和需要下载的包列表,解决一些软件包依赖的问题; 根据生成的包列表使用相应的包管理器工具下载需要的软件包; 使用相应的包管理器生成这些包的 index 文件,如 repodata 或 Packages.gz 文件; 将上述的构建产物 COPY 到同一个容器镜像里,比如 nginx ;也可以导出为 tar 包或目录;
common:适用于一些所有包管理器中包名相同或者对版本无要求的包,比如 vim 、curl、wget 这类工具。一般情况下使用这些工具我们并不关心它的版本,并且这类包的包名在所有的包管理器中都是相同的,所以这类可以划分为公共包。 yum/apt/dnf:适用于不同的发行版使用相同的包管理器。比如 nfs 的包,在 yum 中包名为 nfs-utils 但在 apt 中为 nfs-common,这类软件包可以划分为一类。 OS:适用于一些该 OS 独有的包,比如安装一个 Ubuntu 中有但 Debian 中没有的包(比如 debian-builder 或 ubuntu-dev-tools)。 OS-发行版代号:这类包的版本和发行版代号绑定在一起,比如 docker-ce=5:19.03.15~3-0~debian-stretch
。
docker-ce-19.03.15
,而在 debian 中包名则为 docker-ce=5:19.03.15~3-0~debian-stretch
。可以使用包管理器查看相同的一个包(如 docker-ce)在不同的包管理器之间的差异,如下:roles/container-engine/docker/vars/redhat.yml
roles/container-engine/docker/vars/ubuntu.yml
scratch
,这是一个特殊的镜像名,它代表的是一个空的镜像 layer。这样方便将它导出为 tar 包和目录格式。如果要构建为 tar 包或者本地目录的方式,需要为 Docker 开启 DOCKER_BUILDKIT=1
这个特性。
构建日志如下:
构建产物如下:
Dockerfile.debian
's/debian/ubuntu/g'
,毕竟 Debian 是 Ubuntu 的爸爸嘛~~,所以 apt 使用的方式和包名几乎一模一样,这里就不再赘述了。Dockerfile
CentOS 7
Debian 9 stretch
Debian 10 buster
Ubuntu 18.04 bionic
Ubuntu 20.04 focal
aptly.info:https://www.aptly.info/tutorial/mirror/ jq 常用操作:https://mozillazg.com/2018/01/jq-use-examples-cookbook.html yq 之读写篇:https://lyyao09.github.io/2019/08/02/tools/The-usage-of-yq-read-write/ Build images with BuildKit:https://docs.docker.com/develop/develop-images/build_enhancements/ kubernetes-sigs/kubespray/pull/6766:https://github.com/kubernetes-sigs/kubespray/pull/6766 万字长文:彻底搞懂容器镜像构建 为 CentOS 与 Ubuntu 制作离线本地源:https://www.xiaocoder.com/2017/09/12/offline-local-source/
评论