みつきんのメモ

組み込みエンジニアです。Interface誌で「My オリジナルLinuxの作り方」連載中

Yocot Project CROPSを拡張してkasを使ってみる

はじめに

CROPSを使用すると、ホスト環境の差異を気にせずにbitbakeができるようになるので 非常に便利だが、たまにhosttoolsを追加したりCROPSのDockerイメージを拡張したいケースがある。

その際にCROPSの提供物を直接編集することなく、Dockerイメージを拡張できる方法を模索する。

今回は例としてmeta-raspberrypiをkasでビルドしてみる。

kasのインストール

kasについては以前にYocto meta-raspberrypi環境の作成にkasを使ってみるで扱ったことがある。

bitbakeをラップして、操作を簡略化するためのツール

kasは当然bitbakeを実行するためのホストPCにインストールする必要があるが、CROPSのDockerイメージには入っていない。

Dockerfileを作成する

CROPSのイメージをカスタマイズして、オリジナルのDockerイメージを作成する。

作業場所は~/work/yocto/my_cropsとする。

$ mkdir -p ~/work/yocto/my_crops && cd ~/work/yocto/my_crops

CROPSのDockerイメージはdockerhubで提供されているため、FROM crops/pokyのように指定することができる。

FROM crops/poky

RUN apt-get update && apt-get upgrade -y && \
    apt-get install -y python3-pip && \
    pip3 install kas

こんな感じでいけるはず。

my-cropsという名前で一回ビルドしてみる。

$ docker build -t my-crops .

下記のようなエラーが発生する。

E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
E: Unable to lock directory /var/lib/apt/lists/

13: Permission denied

apt-getするための権限がないと言っている。

まず、このイメージの中でのユーザーを確認する。

FROM crops/poky

RUN whoami && id
$ docker build -t my-crops .
(... snip ...)
Step 2/2 : RUN whoami && id
 ---> Running in bc35fe0307ff
usersetup
uid=70(usersetup) gid=70(usersetup) groups=70(usersetup)
Removing intermediate container bc35fe0307ff
 ---> abc853892995

usersetupというユーザーでuid=70gid=70らしい。

CROPSのDockerfileを確認すると次のようになっている。

( ...snip ...)
USER usersetup
ENV LANG=en_US.UTF-8
( ...snip ...)

USERでユーザーを指定している。

USERを切り替える

Dockerfileを下記のように書換えてみる。

FROM crops/poky

USER root

RUN apt-get update && apt-get upgrade -y && \
    apt-get install -y python3-pip && \
    pip3 install kas

USER usersetup
$ docker build -t my-crops .
(... snip ...)
uccessfully tagged my-crops:latest

Dockerイメージまではできたようだ。

meta-raspberrypiをkasでビルド

meta-raspberrypiの取得

gitでmeta-raspberrypiを取得する。

$ git clone git://git.yoctoproject.org/meta-raspberrypi -b honister

ブランチの変更

meta-raspberrypiからみて、外部のリポジトリをダウンロードしてくる。

  • poky
  • meta-openembedded
  • meta-qt5

これらはmasterブランチを使用するようになっているが、今回はhonisterを使用したい。

プロジェクトファイルとなるkas-poky-rpi.ymlのrefspecで、closeするリポジトリのブランチやコミットハッシュを指定することができる。

今回は下記のようにしてrefspecをmasterからhonisterに書き換える。

$ sed 's/master/honister/' -i meta-raspberrypi/kas-poky-rpi.yml

CROPSでkasを実行

my-cropsからコンテナを作成しkasを実行する。

$ docker run --rm -it -v "$(pwd)":"$(pwd)" my-crops --workdir="$(pwd)" bash -c "kas build $(pwd)/meta-raspberrypi/kas-poky-rpi.yml"

まとめ

CROPSのDockerイメージにパッケージを追加する方法試してみた。

Dockerfileを新規に作成し、FROM poky/cropsとすることで、CROPSが提供するDockerfileを編集するすることなく CROPSのイメージを拡張することができた。

USERがroot以外になっているため、apt-getのようなroot権限が必要なコマンドの前にユーザーを切り替える必要があることに気をつける必要がある。

サードパーティのBSPなどレイヤの作りによっては、ホストPC側にコマンドを追加したいケースがあるが、 そういう場合でもCROPSを使用できることが確認できた。