はじめに
Docker buildxコマンドを使って、クロスコンパイルすると、Segmentation fault (core dumped)が頻発する際の対処方法を紹介する。Segmentation fault (core dumped)は、再現性がなく、発生したりしなかったりする。
動作確認環境
- Ubuntu 22.04 x86_64
- Docker
docker version Client: Docker Engine - Community Version: 28.1.1 API version: 1.49 Go version: go1.23.8 Git commit: 4eba377 Built: Fri Apr 18 09:52:18 2025 OS/Arch: linux/amd64 Context: default Server: Docker Engine - Community Engine: Version: 28.1.1 API version: 1.49 (minimum version 1.24) Go version: go1.23.8 Git commit: 01f442b Built: Fri Apr 18 09:52:18 2025 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.7.27 GitCommit: 05044ec0a9a75232cad458027ca83437aae3f4da runc: Version: 1.2.5 GitCommit: v1.2.5-0-g59923ef docker-init: Version: 0.19.0 GitCommit: de40ad0 ```
原因
エラー発生時のクロスコンパイル時に利用していたQEMUは、multiarch/qemu-user-staticであった。buildxが出た当時は、こちらが推奨されていたが、既に開発が終了している。QEMUを変更するとエラーが解消されたため、QEMUが古かったことが原因と考えられる。
対策
QEMUを、公式ドキュメントの推奨のtonistiigi/binfmtに変更する。執筆時点のbinfmtの最新版は、deploy/v9.2.2-52なので、こちらを適用する。
Dockerビルド実行前に、QEMUの設定をBefore(変更前)からAfter(変更後)に変更する。
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
docker run --privileged --rm tonistiigi/binfmt:qemu-v9.2.2-52 --uninstall qemu-*
docker run --privileged --rm tonistiigi/binfmt:qemu-v9.2.2-52 --install all
結果
QEMUを変更したところ、Segmentation fault (core dumped)が発生しなくなった。
まとめ
Docker buildxコマンドを使って、クロスコンパイルすると、Segmentation fault (core dumped)が頻発する際の対処方法を紹介した。QEMUを最新のものに変更することでSegmentation fault (core dumped)が発生しなくなった。Docker buildxコマンドでクロスコンパイルに失敗する場合に試してみてほしい。
参考