0
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Organization

Google Cloud Buildでx86/amd64以外のアーキテクチャ用のコンテナイメージを作る

はじめに

Raspberry PiでもCPUやメモリの性能が向上して、コンテナを動かしたりしやすくなってきました。
単純にDockerを動かすだけではなく、Kubernetesでクラスタを組むことも、事例として見かける機会が増えました。
自分も、コンテナ化したアプリケーションをRaspberry Pi 3B上で動かしています。

動かす取り組みの中で、Raspberry Pi用のコンテナイメージの作り方について試行錯誤した結果、Cloud Buildを使って作れるようになったので、ポイントを紹介しようと思います。
この方法は、Raspberry Piに代表されるARM系以外にも(おそらく)応用可能です。

(ちなみに、qemu-user-staticパッケージをインストールしたり、DockerのBuildxなどが使えればそれでも実現できるので、今回はCloud Buildで、という制約があるものとします。)

ポイント

以下は、ざっくりとしたcloudbuild.yamlです。

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などでも、コンテナを動かす人が増えたらいいなと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?