見出し画像

UbuntuとかDebianの一つのサーバでマルチアーキテクチャDockerイメージを作る方法

背景

一つのサーバでマルチアーキテクチャDockerイメージを作りたい。
docker buildxを使うと実現出来る。
ですが、
普通にDocker Engineを入れたUbuntuだとdocker buildxを実行したタイミングでエラーになります。
※比較的新しいバージョンのDocker Desktopが入ったMacとかWindowsだと何も考えずにビルドが成功します。

docker buildxは、マルチアーキテクチャのDockerイメージをビルドするためのDocker CLIプラグインです。このプラグインを使用すると、x86、ARM、PowerPCなど、複数のアーキテクチャでイメージをビルドすることができます。また、ビルドを高速化するために、ビルドキャッシュやマルチステージビルドなどの機能が含まれています。

なぜかコケるのか

docker buildxでマルチアーキテクチャビルドが通る条件として
QEMUという仮想化のツールが入っていることが条件で
これが入っていないとビルド出来ません。

QEMUは、仮想化ソフトウェアの一種であり、異なるアーキテクチャのハードウェアやオペレーティングシステムをエミュレートすることができます。QEMUは、x86、ARM、PowerPCなど、多くのアーキテクチャをサポートしており、Linux、Windows、macOSなど、さまざまなオペレーティングシステムをエミュレートすることができます。

Dockerをインストールしたタイミングでは、QEMUが入っていなくてもエラーにはならず、
通常のdocker buildコマンドの場合も正常にビルド出来てしまいます。

buildxを使ってマルチアーキテクチャビルドをするタイミングで、ビルド環境が作れずに落ちる、といった挙動になります。

ということで、マルチアーキテクチャビルドが出来る環境を作っていきましょう。

準備

Docker Engineのインストール

sudo apt-get install -y docker-ce docker-ce-cli

QEMUを含む、必要なパッケージ類のインストール

sudo apt-get install -y qemu qemu-user-static binfmt-support debootstrap

以上

この状態で

buildx createでビルダー環境を作成し

docker buildx create --name mybuilder
docker buildx use mybuilder

ビルドを実行

docker buildx build -t xxx/xxx:tagname --platform linux/amd64,linux/arm64 --push .

これで無事Ubuntu、Debian環境でもビルド出来るようになります。

Github ActionsやCircleCIなどで複数環境向けのDockerイメージをビルドしたい場合の一つの選択肢として使えると思います。

CI / CD環境でのマルチアーキテクチャビルドの方法としては
matrixのオプションを使うであるとか、別の方法で複数のプラットフォーム向けにビルドするという事も可能だったりします。

CI / CDでのマルチアーキテクチャビルドはまた別の機会に書いてみようと思います。

この記事が気に入ったらサポートをしてみませんか?