はじめに
IntelやAMDといったx86アーキテクチャ向けにしか提供されていないDockerイメージをラズパイ上で利用しようとするとエラーが発生してしまいます。
例えば、ラズパイ上でdocker run
で起動しようとすると以下のようなexec format error
が出たり、、
standard_init_linux.go:211: exec user process caused "exec format error"
docker pull
を実行すると以下のようなno matching manifest
というエラーが出たりします。
試しにARM向けのイメージが提供されていないmysqlの公式イメージをpullしてみると、以下のようなエラーが発生しました。
$ docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
no matching manifest for linux/arm64/v8 in the manifest list entries
ラズパイに搭載されているCPUはARMアーキテクチャのものであり、当然ながらCPUのアーキテクチャが異なるイメージを動かすことはできません。
しかし、ARM向けにDockerイメージをビルドすればラズパイ上でもそのイメージが利用できるようになります。
今回は例としてオープンソースの経路検索エンジンOSRM backend
のDockerイメージを使って解説します。
(ラズパイで経路検索サーバをたてようとしたのですがOSRM backendのイメージがARMに対応しておらず、環境構築に少し手間取ってしまったため今回の記事を書く発端となっています)
前提
今回検証した環境は以下の通りです。
[ラズパイ]
機種: Raspberty PI 4 Model B
メモリ: 8GB
OS: Raspbian OS 64bit
[作業マシン]
MacBook Pro: 2019
メモリ: 16GB
SSD: 250GB
[Docker]
バージョン: 20.10.7
(buildx
を使うのでバージョン19.03以降のものを使用します)
なお、ラズパイ上イメージをビルドしても良いのですが、手元のMacの方が処理が速いため
今回はMac上でビルドするものとします。
手順
1: ORSM backendのプロジェクトをgit clone
してDockerファイルをプロジェクトフォルダ直下にコピーします。
git clone https://github.com/Project-OSRM/osrm-backend.git
cd osrm-backend/docker
cp Dockerfile ../
cd ..
2: ARMのCPU向けにdockerのイメージをビルドします。ここではdockerのbuildxを使います。
docker buildx build --platform linux/arm64/v8 --tag osrm-backend-arm64:latest .
パラメータの--platform
がポイントです。
上に書いたno matching manifest for linux/arm64/v8 in the manifest list entries
というエラーメッセージにプラットフォーム名が表示されるのでこれと同じ文字列を指定します。
ここではlinux/arm64/v8
を指定します。
なお、ビルドは非常に時間がかかります。自分のMacでは1時間以上かかりました。。。
3: イメージをtar形式で保存します。
以下を実行してosrm-backend-arm64
という名前のイメージがtar形式で保存します。
docker save -o osrm-backend-arm64.tar osrm-backend-arm64
4: scpなどで作業マシンからラズパイへtar形式のイメージをコピーします。
scpのパラメータ(ポート番号、ユーザ名、ホスト名等)は適宜ご自身の環境に合わせて指定してください。
(ここでは公開鍵認証を使っています)
tarはラズパイ上の/tmpにコピーするものとします。
scp -P xxx -i ~/.ssh/id_rsa osrm-backend-arm64.tar yyy@aaa.bbb.ccc.ddd:/tmp
5: ラズパイにsshでログインしてコピーしたイメージをラズパイのdocker上にロードします。
cd /tmp
docker load -i osrm-backend-arm64.tar
以上でARMのCPUを搭載しているラズパイでもOSRM backendのイメージが利用できるようになります。
まとめ
今回はOSRM backendを題材に挙げましたが、他にもIntel/AMD向けのイメージしか提供されていないイメージをラズパイでも動かしたい場合はbuildx
を使うことで利用可能となります。