はじめに
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=70
、gid=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を使用できることが確認できた。