4
0

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.

SpeeeAdvent Calendar 2019

Day 10

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

Last updated at Posted at 2019-12-10

はじめに

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

4
0
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
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?