みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

yoctoでコンテナイメージを取り込む(その2)

はじめに

シリーズもの。

前回、コンテナを組み込むためのレシピを作成した。

今回は下記の構成でコンテナを組み込む方法を検討する。

コンテナ タイミング
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分かかった。 コンテナイメージの数が増えるとその分長くなるの、現実的に運用は難しいかもしれない。