使用 Docker 構(gòu)建 yum/apt 離線源
首先由于各個包之間的依賴關(guān)系比較復(fù)雜,并不能將它們直接下載下來; 其次即便下載下來之后也無法直接通過 yum/apt 的方式安裝指定的軟件包,雖然也可以使用 scp 的方式將這些包復(fù)制到部署節(jié)點,通過 rpm 或 dpkg 的方式來安裝上,但這樣并不是很優(yōu)雅,而且通用性能也不是很好; 最后需要適配的 Linux 發(fā)行版和包管理器種類也有多種,而且有些包的包名或者版本號在不同的包管理之間也相差甚大,無法做到統(tǒng)一管理。

在構(gòu)建容器內(nèi)配置 yum/apt 源,安裝構(gòu)建時需要工具; 生成系統(tǒng)內(nèi)的 rpm/deb 包的列表和需要下載的包列表,解決一些軟件包依賴的問題; 根據(jù)生成的包列表使用相應(yīng)的包管理器工具下載需要的軟件包; 使用相應(yīng)的包管理器生成這些包的 index 文件,如 repodata 或 Packages.gz 文件; 將上述的構(gòu)建產(chǎn)物 COPY 到同一個容器鏡像里,比如 nginx ;也可以導(dǎo)出為 tar 包或目錄;
common:適用于一些所有包管理器中包名相同或者對版本無要求的包,比如 vim 、curl、wget 這類工具。一般情況下使用這些工具我們并不關(guān)心它的版本,并且這類包的包名在所有的包管理器中都是相同的,所以這類可以劃分為公共包。 yum/apt/dnf:適用于不同的發(fā)行版使用相同的包管理器。比如 nfs 的包,在 yum 中包名為 nfs-utils 但在 apt 中為 nfs-common,這類軟件包可以劃分為一類。 OS:適用于一些該 OS 獨有的包,比如安裝一個 Ubuntu 中有但 Debian 中沒有的包(比如 debian-builder 或 ubuntu-dev-tools)。 OS-發(fā)行版代號:這類包的版本和發(fā)行版代號綁定在一起,比如 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。這樣方便將它導(dǎo)出為 tar 包和目錄格式。

如果要構(gòu)建為 tar 包或者本地目錄的方式,需要為 Docker 開啟 DOCKER_BUILDKIT=1這個特性。

構(gòu)建日志如下:

構(gòu)建產(chǎn)物如下:

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 萬字長文:徹底搞懂容器鏡像構(gòu)建 為 CentOS 與 Ubuntu 制作離線本地源:https://www.xiaocoder.com/2017/09/12/offline-local-source/
評論
圖片
表情
