はじめに
Raspberry PiでもCPUやメモリの性能が向上して、コンテナを動かしたりしやすくなってきました。
単純にDockerを動かすだけではなく、Kubernetesでクラスタを組むことも、事例として見かける機会が増えました。
自分も、コンテナ化したアプリケーションをRaspberry Pi 3B上で動かしています。
動かす取り組みの中で、Raspberry Pi用のコンテナイメージの作り方について試行錯誤した結果、Cloud Buildを使って作れるようになったので、ポイントを紹介しようと思います。
この方法は、Raspberry Piに代表されるARM系以外にも(おそらく)応用可能です。
(ちなみに、qemu-user-staticパッケージをインストールしたり、DockerのBuildxなどが使えればそれでも実現できるので、今回はCloud Buildで、という制約があるものとします。)
ポイント
以下は、ざっくりとしたcloudbuild.yaml
です。
steps:
- id: 'build'
name: gcr.io/cloud-builders/docker:18.09.6
entrypoint: bash
args:
- '-c'
- |-
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
docker build -t gcr.io/${PROJECT_ID}/hoge:latest .
waitFor: ['-']
images:
- 'gcr.io/${PROJECT_ID}/hoge:latest'
一番のポイントは、 docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
です。
これにより、他のCPUの命令をQEMUでエミュレーションして実行することができるようになります。
そして、以下はARM用のアプリケーションのDockerfile
の例です。
FROM arm32v7/python:3.7.5-alpine3.10
WORKDIR /opt/hoge
COPY . /opt/hoge
RUN apk add --no-cache --update tzdata tini
ENTRYPOINT ["/sbin/tini", "--", "python", "main.py"]
もう一つのポイントは、arm32v7
の部分です。公式で提供されているDockerイメージは先頭にアーキテクチャを指定するとそれ用のイメージがpullできるようになっているようです(たぶん)。
これにより、arm32v7(= Raspberry Pi 2, 3向け)のコンテナイメージが作られます。
もし、一番のポイントを実行しなかった場合、以下のように、exec format errorになります。
Step 4/5 : RUN apk add --no-cache --update tzdata tini
---> Running in 765086660a24
standard_init_linux.go:211: exec user process caused "exec format error"
arm32v7の部分を、お好きなアーキテクチャに変更すれば、そのアーキテクチャ上で動くイメージが作れると思います。
小ばなし
Google Container Repositoryからコンテナイメージを取得する方法はいくつかあるみたいです。
自分はサービスアカウントを使うことにしたのですが、その場合は以下のコマンドで取得できるようになります。
cat credentials.json | docker login -u _json_key --password-stdin https://gcr.io
※ サービスアカウントのJSONキーをcredentials.jsonとして保存した想定
※ pullしてくるリポジトリはgcr.ioを想定, asia.gcr.ioなどの場合はURLを変更すればOK
おわりに
いかがでしたでしょうか。これでGoogle Cloud Buildでx86/amd64以外のアーキテクチャ用のDockerイメージを作れるようになったかと思います。
Raspberry Piなどでも、コンテナを動かす人が増えたらいいなと思います。