Github Actionsで複数のアーキテクチャ向けのDockerイメージを作る
🆙 2021/03/21 docker公式アクションを使ってイメージを作る記事を書きました
🆙 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ではarm64
とarm
アーキテクチャがサポートされているのでMac上だと動かすことは可能です)
Dockerfileを複数用意してタグで環境を管理するのもちょっとめんどい
buildx
そこで buildx を使います
buildxを使うことで様々なアーキテクチャ用のイメージを作成することができます
今回はGitHubActions上でのbuildxを使ったビルドをやってみます
GitHub Actionsの設定
今回はテストとして以下のルールでDockerHubへイメージをpublishしてみます
- masterブランチにpushされたら実行
- 作成するイメージのアーキテクチャは
amd64
/arm32v7
- 作成したイメージをDockerHubへpublish
- イメージ名はgithubの
org/repository
とする(今回のテストではsminamot/multi-arch-sample
) - イメージタグは
latest
- イメージ名はgithubの
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 | <パスワード> |
両方とも設定できて以下のようになっていればOK
Dockerfileと上記のyamlをGitHubへpushすればjobが開始されます
DockerHubも見てみると…
同じlatestタグでamd64
とarm/v7
のイメージができてる 🎉🎉🎉
これでラズパイ環境用だけでなく、EC2などでも使えるイメージになりました
おわりに
今回作ったリポジトリとDockerイメージはこちらです