以下の内容はhttps://mickey-happygolucky.hatenablog.com/entry/2024/12/22/164557より取得しました。


yoctoでコンテナ用イメージを作成する

はじめに

Yocto Projectではmeta-virtualizationでdockerなどのコンテナや仮想化に関する機能を提供している。

dockerを組み込むことは YoctoProject ラズパイ4でdocker で行ったが、コンテナ用イメージ自体を作成することもできるようになっている。

bitbakeで作成したイメージをdockerにインポートするところまで試してみる。

環境構築

作業ディレクト

作業ディレクトリを作成する。

$ mkdir -p ~/yocto/scarthgap
$ cd ~/yocto/scarthgap

Pokyの取得

scarthgapブランチの最新を使用する場合は下記。

$  git clone git://git.yoctoproject.org/poky.git -b scarthgap

リリースされたタグのバージョンを使用する場合は下記。

$ git clone git://git.yoctoproject.org/poky.git
$ git fetch --tags
$ git checkout -b tags/scarthgap-5.0.5 scarthgap-5.0.5

環境変数の設定

oe-init-build-envを実行する。

$ source poky/oe-init-build-env build

meta-virtualizationの取得

meta-virtualizationを取得する。

$ bitbake-layers layerindex-fetch meta-virtualization

local.confの修正

qemuのための設定とdockerを組み込むための設定を追加する。

MACHINE ?= "qemuarm64"
INIT_MANAGER ?= "systemd"
DL_DIR ?= "${TOPDIR}/../downloads"

QB_OPT_APPEND:append = " -echr 0x14"


EXTRA_IMAGE_FEATURES += "ssh-server-openssh"
IMAGE_INSTALL:append = " packagegroup-docker"
DISTRO_FEATURES:append = " virtualization"

IMAGE_ROOTFS_EXTRA_SPACE = "5242880"

ビルド

bitbakeを実行する。

$ bitbake core-image-base

これで、実行する環境は整った。

コンテナをビルド

app-container.bb

meta-virtualizatoinにはrecipes-demo/images/app-container.bbが提供されている。 このレシピでは、dockerやpodmanにimport可能なイメージが作成できる。

ビルド

$ bitbake app-conatiner

エラー

このようなエラーが発生する

ERROR: Nothing RPROVIDES 'app' (but /home/mickey/seagate/yocto/scarthgap/poky/meta-virtualization/recipes-demo/images/app-container.bb RDEPENDS on or otherwise requires it)
NOTE: Runtime target 'app' is unbuildable, removing...
Missing or unbuildable dependency chain was: ['app']
ERROR: Required build target 'app-container' has no buildable providers.
Missing or unbuildable dependency chain was: ['app-container', 'app']

原因はこれ

OCI_IMAGE_ENTRYPOINT = "/usr/bin/flask-app"
CONTAINER_SHELL = "busybox"

IMAGE_INSTALL:append = "helloworld-flask" ★これ

IMAGE_FSTYPES = "container oci"

このように修正する。

 CONTAINER_SHELL = "busybox"

-IMAGE_INSTALL:append = "helloworld-flask"
+IMAGE_INSTALL:append = " helloworld-flask"

 IMAGE_FSTYPES = "container oci"

これはmasterブランチでは修正されているので、YP5.2相当では解消される見込み。

コンテナの実行

QEMUの実行

まずはQEMUを起動する。

$ runqemu nographic
... (snip) ...
Poky (Yocto Project Reference Distro) 5.0.5 qemuarm64 ttyAMA0

qemuarm64 login: root

WARNING: Poky is a reference Yocto Project distribution that should be used for
testing and development purposes only. It is recommended that you create your
own distribution for production use.

root@qemuarm64:~#

起動時のメッセージ

筆者が講師をするセミナでも説明するようにしているが、 「Pokyはあくまでもリファレンスでテスト用なので、製品にそのまま使用することは推奨しない」。

最近のバージョンではOS起動時にその旨のメッセージが表示されるようになっている。

WARNING: Poky is a reference Yocto Project distribution that should be used for testing and development purposes only. It is recommended that you create your own distribution for production use.

コンテナ用イメージの転送

別の端末を開いてコンテナ用イメージをQEMUに転送する。

$ cd tmp/deploy/images/qemuarm64
$ scp ./app-container-qemuarm64.rootfs.tar.bz2 root@192.168.7.2:/root

コンテナの実行

QEMUの端末で操作する。

まずはイメージをインポートする。

# docker import ./app-container-qemuarm64.rootfs.tar.bz2 app:latest
# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
app          latest    000695ac3617   3 minutes ago   269MB

コンテナを実行する。

$ docker run --rm -it app /bin/ls
[ 1324.825149] docker0: port 1(vethb3abd02) entered blocking state
[ 1324.827097] docker0: port 1(vethb3abd02) entered disabled state
[ 1324.827685] vethb3abd02: entered allmulticast mode
[ 1324.829767] vethb3abd02: entered promiscuous mode
[ 1329.394801] eth0: renamed from vethe3628e0
[ 1329.432275] docker0: port 1(vethb3abd02) entered blocking state
[ 1329.433104] docker0: port 1(vethb3abd02) entered forwarding state
bin    dev    home   media  proc   run    sys    usr
boot   etc    lib    mnt    root   sbin   tmp    var
[ 1331.354307] vethe3628e0: renamed from eth0
[ 1331.380880] docker0: port 1(vethb3abd02) entered disabled state
[ 1331.498644] docker0: port 1(vethb3abd02) entered disabled state
[ 1331.509925] vethb3abd02 (unregistering): left allmulticast mode
[ 1331.510781] vethb3abd02 (unregistering): left promiscuous mode
[ 1331.511041] docker0: port 1(vethb3abd02) entered disabled state

実行できた。

まとめ

meta-virtualizationではdockerを組み込むことができるだけではなく コンテナ用のイメージをビルドするためのレシピが提供されている。

これを参考に自分たちのカスタムイメージを作成することができる。 このイメージはdockerだけではなく、podmanでもインポートができる。

現時点では、bitbake時にこれを組み込むような仕組みは用意されていないが、 コンテナベースの組み込みOSを設計・実装するヒントになるかもしれない。




以上の内容はhttps://mickey-happygolucky.hatenablog.com/entry/2024/12/22/164557より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14