13
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Raspberry Pi上のDockerで動くイメージのCIでのビルド方法

Posted at

発端

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
13
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?