(請注意這個問題關於 LXC 1.x,而這個關於 LXC 2.x/LXD)
我在網路上搜尋了這個問題的答案,但無法想出任何合理的非駭客答案。
我正在尋找以我想要的方式塑造現有模板的方法。我特別想要的是透過在其根 FS 中進行各種更改並添加/更改配置來自訂上游 Ubuntu 雲映像。
因此,我目前的方法是lxc launch ubuntu:lts CONTAINER
運行lxc exec CONTAINER -- ...
我編寫的腳本(將其推入容器後)來執行我的自訂。
我使用這種方法得到的是一個合理定制的容器。唉,有一個問題。此時的容器已準備好cloud-init
,它是一個容器實例,而不是映像/模板。
所以這就是我現在不知所措的地方。我需要的是將我的容器轉回圖像(應該可以通過使用lxc publish
),並撤消對它所做的更改,cloud-init
或者至少cloud-init
再次“cock”,以便下次將圖像用作lxc init
或的源時觸發lxc launch
。或者,也許有一種方法可以cloud-init
在我lxc launch
從上游圖像中完全禁用它?
有權威的方法嗎?儘管我查閱了各種文檔,包括LXD 儲存庫中的 Markdown 文檔以及 Stéphane Graber(LXD 專案負責人)的部落格系列,特別是[5/12],我無法找到合適的方法。也許我只是錯過了它(也就是說,如果您知道一些描述我需要的內容,我將很樂意閱讀更多文件)。
使用的 LXC 版本是 2.20(即我使用的是 LXD 前端)。
答案1
在連結的頁碼 [5/12]透過 Stéphane Graber,您可以找到第二種方法:
手動建立圖像
建立自己的形像也非常簡單。
- 生成容器檔案系統。這完全取決於您使用的發行版。對於 Ubuntu 和 Debian,可以使用 debootstrap。
- 配置分發在容器中正常工作所需的任何內容(如果需要的話)。
- 製作該容器檔案系統的 tarball,可以選擇壓縮它。
- 根據上述文件撰寫一個新的metadata.yaml 檔案。
- 建立另一個包含該metadata.yaml 檔案的tarball。
- 使用下列命令將這兩個 tarball 匯入為 LXD 映像:
這樣,您無需在發布映像之前啟動容器。您可以從現有影像開始:
$ lxc image copy ubuntu:16.04/amd64 local: --alias ubuntu
$ mkdir export-directory
$ lxc image export ubuntu export-directory
$ cd export-directory
$ ls
5f364e2e3f460773a79e9bec2edb5e993d236f035f70267923d43ab22ae3bb62.squashfs
meta-5f364e2e3f460773a79e9bec2edb5e993d236f035f70267923d43ab22ae3bb62.tar.xz
$ mkdir meta squashfs
$ tar -xf *.tar.xz -D meta
$ sudo unsquashfs -f -d squash/ *squashfs
現在您可以調整檔案甚至 chroot 到南瓜目錄中。然後,您可以 tar 這兩個目錄並使用以下命令匯入調整後的圖像:
lxc image import <metadata tarball> <rootfs tarball> --alias my-adjusted-image
答案2
lxd
建構/圖像的主要工具lxc
是發行版建構者
配置影像的現代方法是雲端初始化
為了自訂 LXD / LXC 影像,我寫道:
Distrobuilder 的 python 控制台前端(包含兩者)
它遵循一個類似的方法到 Hashicorp Packer 並分層建置模板。
- 建立
base
覆蓋standard
模板並包含您的shell
自訂和其他自訂的圖像 custom
使用您的網路服務等創建一個圖像覆蓋來覆蓋您的base
圖像(即在生成圖像時使用base
圖像模板作為模板)SOURCE
自訂模板使用您的自訂服務覆蓋/cloud-init 配置)
我用於dbmenu
構建非特權 LXD 容器並添加(和包)示例配置來創建:
base
經過一些客製化的Alpine Linux / Ubuntu鏡像- Alpine Linux 建置環境
alpine-sdk
(&cloud-init
在首次啟動時被刪除) - 首次啟動時安裝 Gitlab 的 Ubuntu 容器(透過 cloud-init)
我還用來dbmenu
建立一個適合在rootless
內部運行 podman / docker 的Ubuntu 映像lxd
(在撰寫本文時尚未添加到例子)
這自述文件現在已經相當完整了
Ubuntu 的 LXD 和新的
incus
fork 都支援建置鏡像請參閱依賴關係需要
dbmenu
.在2023 年 10 月您需要最新git
版本來distrobuilder
建立最新的範本格式在幕後
dbmenu
是使用 Mike Farahyq
將yaml
模板合併在一起(yq
&distrobuilder
都是用相同的底層庫編寫的Go
,所以都使用相同的底層yaml
庫)使用
PyYaml
合併是有問題的 - 它讀取和寫入配置yaml
的速度非常快yaml.CSafeLoader
dbmenu
安裝非常簡單:pipx install distrobuilder-menu
(pypi - 最新版本)pipx install git+https://github.com/itoffshore/distrobuilder-menu.git
(github最新dev
/發布)