発端
x86_64アーキテクチャ上でビルドしたDockerイメージが、Raspberry Pi上で動かない。
(Kubernetesクラスター on Raspberry Piでうまく動かなかった)
エラー内容
standard_init_linux.go:211: exec user process caused "exec format error"
理由
ビルドしたマシンと、Raspberry PiとでCPUアーキテクチャが異なるため。
# 普段使ってるLinux
$ uname -m
x86_64
# Raspberry Pi
$ uname -m
armv7l
対策1
Raspberry Pi上でイメージをビルドする。
この時、FROM node
ではなく、FROM arm32v7/node
等、arm用のベースイメージに変更する必要がある(場合もある)。
対策2
対策1には実機が必要になる。
CIでイメージを作成したい場合等には利用できない。(ほとんどのCIはx86_64アーキテクチャなので)
そこで、multiarch/qemu-user-staticを利用することで、x86_64アーキテクチャ上でarm用イメージをビルドできるようになる。
例
name: main
on: [push, pull_request]
jobs:
main:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: setup docker for arm
run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
- name: build image
run: docker build -f Dockerfile.arm -t owner/name:arm .
- name: push image
run: |
docker login -u ${{ secrets.DOCKER_USER }} -p ${{ secrets.DOCKER_PASS }}
docker push owner/name:arm