はじめに
シリーズもの。
前回、コンテナを組み込むためのレシピを作成した。
今回は下記の構成でコンテナを組み込む方法を検討する。
コンテナ | タイミング |
---|---|
podmand | pkg_postinst_ontarget |
コンテナ
dockerと比較してpodmanは実行時にデーモンが必要ないため実現しやすい。
タイミング
下記のメリットがある。
- ターゲット上で実行するためハードウェアアーキテクチャに関する検討が不要。
- nativeパッケージが不要。
- ローカルストレージのパスなどを変更・調整するための検討が不要。
デメリットとしては、初回起動時のブート時間がインポート処理の分長くなることが考えられる。
レシピの修正
レシピに下記の部分を追加する。
20 21 RDEPENDS:${PN} = "podman" 22 23 pkg_postinst_ontarget:${PN} () { 24 podman import /opt/data/${CONTAINER_IMAGE} app 25 }
21行目で実行時依存関係にpodmanを設定する。
23〜25行目のpkg_postinst_ontarget:${PN}
で、podman importを実行する。
全体像
レシピの全体像はこのようになる。
LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" DEPENDS = "app-container" do_fetch[noexec] = "1" do_unpack[noexec] = "1" do_patch[noexec] = "1" do_configure[noexec] = "1" do_compile[noexec] = "1" CONTAINER_IMAGE ?= "app-container-${MACHINE}.rootfs.tar.bz2" do_install() { install -d ${D}/opt/data install -m 644 ${DEPLOY_DIR_IMAGE}/${CONTAINER_IMAGE} ${D}/opt/data/${CONTAINER_IMAGE} } FILES:${PN} = "/opt/data/*" RDEPENDS:${PN} = "podman" pkg_postinst_ontarget:${PN} () { podman import /opt/data/${CONTAINER_IMAGE} app }
動作確認
ビルドとQEMU起動
ビルドしQEMUを起動する。
$ bitbake core-image-base $ runqemu nographic
QEMU上での動作確認
postinst処理のログ。
root@qemuarm64:~# cat /var/log/postinstall.log Running postinst /etc/rpm-postinsts/100-container-app...
container-appパッケージのpostinstが実行されたことがわかる。
コンテナイメージの確認
# podman images REPOSITORY TAG IMAGE ID CREATED SIZE localhost/app latest fc45e88cf78e 6 years ago 273 MB
イメージのインポートは成功している。
まとめ
podman環境とpkg_postinst_ontargetの組み合わせによるイメージの組み込みは かなり簡単に実現できることが確認できた。
初回起動時のブート時間は実測で約2分かかった。 コンテナイメージの数が増えるとその分長くなるの、現実的に運用は難しいかもしれない。