えんじにあメモ

試してみた技術とか、たまに家電ネタ

Github Actionsで複数のアーキテクチャ向けのDockerイメージを作る

🆙 2021/03/21 docker公式アクションを使ってイメージを作る記事を書きました

sminamot-dev.hatenablog.com

🆙 2020/06/20 crazy-max/ghaction-docker-buildx の利用をv1 -> v3に更新

あらすじ

前回おうちk8sの環境がめでたく整いました 🎉 sminamot-dev.hatenablog.com

さて何か動かすためにDockerイメージを作ろ、と思ってまずは適当に以下のような(なんの意味もない)イメージを作りました

FROM alpine:3.11

ENTRYPOINT ["echo", "hogehoge"]

Macでビルド後DockerHubに上げて、いざラズパイ上で動かしてみると…

$ sudo docker run --rm sminamot/multi-arch-sample
standard_init_linux.go:211: exec user process caused "exec format error"

おちた

原因は、ラズパイはarmアーキテクチャで動いているが、上記DockerfileをビルドしたMac環境ではx86_64アーキテクチャで動いていて、 ビルド時のalpineはx86_64向けのイメージが使われているため 😰

対策としてはDockerfileで明示的にarm向けのalpineを指定してあげれば良い

-FROM alpine:3.11
+FROM arm32v7/alpine:3.11

ENTRYPOINT ["echo", "hogehoge"]

しかし、これだと今度はx86_64アーキテクチャの環境では動かせない
(Docker Desktopではarm64armアーキテクチャがサポートされているのでMac上だと動かすことは可能です)

Dockerfileを複数用意してタグで環境を管理するのもちょっとめんどい

buildx

そこで buildx を使います

docs.docker.com

buildxを使うことで様々なアーキテクチャ用のイメージを作成することができます

今回はGitHubActions上でのbuildxを使ったビルドをやってみます

GitHub Actionsの設定

今回はテストとして以下のルールでDockerHubへイメージをpublishしてみます

  • masterブランチにpushされたら実行
  • 作成するイメージのアーキテクチャamd64/arm32v7
  • 作成したイメージをDockerHubへpublish
    • イメージ名はgithuborg/repositoryとする(今回のテストではsminamot/multi-arch-sample
    • イメージタグはlatest

buildxではpushオプションがあり、ビルドしたイメージをそのままpublishすることが可能です

.github/workflows/docker.yml を作ります

name: Publish Docker image
on:
  push:
    branches:
      - master
jobs:

  build:
    name: build and publish
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@master

      - name: Set up Docker Buildx
        id: buildx
        uses: crazy-max/ghaction-docker-buildx@v3
        with:
          buildx-version: latest
          qemu-version: latest

      - name: Login DockerHub
        run: |
          echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin

      - name: Build and Publish
        run: |
          docker buildx build \
            --push \
            --platform linux/arm/v7,linux/amd64 \
            -t ${{ github.repository }}:latest .

--platform オプションに,区切りで対象のプラットフォームを指定します
上記設定でのGitHub Actions上では以下のプラットフォームが指定可能でした(Set up Docker Buildxの出力で確認)

buildx自体のセットアップには↓を利用させてもらいました
GitHub - crazy-max/ghaction-docker-buildx: GitHub Action to set up Docker Buildx

事前に対象のGitHubレポジトリにDockerHubのIDとパスワードを設定しておきます

GitHubのSettings -> Secrets で作成

Name Value
DOCKER_USERNAME <ID>
DOCKER_PASSWORD <パスワード>

f:id:shosfs:20200201183357p:plain

両方とも設定できて以下のようになっていればOK

f:id:shosfs:20200201183446p:plain

Dockerfileと上記のyamlGitHubへpushすればjobが開始されます

f:id:shosfs:20200201185011p:plain

DockerHubも見てみると… f:id:shosfs:20200201185419p:plain 同じlatestタグでamd64arm/v7のイメージができてる 🎉🎉🎉

これでラズパイ環境用だけでなく、EC2などでも使えるイメージになりました

おわりに

今回作ったリポジトリとDockerイメージはこちらです

参考