問題の内容
Arch Linux の docker image の CPU アーキテクチャは AMD64 のみで ARM がない.
Apple シリコン上の Docker Desktop でも, AMD64 を指定してビルドすれば以前はできていたが,
いつからか pacman でエラーが発生するようになった.
FROM archlinux
RUN pacman -Syu --noconfirm --needed make clang gtest \
&& pacman -Scc --noconfirm \
&& rm -rf /var/cache/pacman/pkg/*
$ docker image build . --platform linux/amd64 -t skkzsh/gtest
...
=> ERROR [2/2] RUN pacman -Syu --noconfirm --needed make clang gtest && pacman -Scc --noconfirm && rm -rf /var/cache/pacman/pkg/* 0.2s
------
> [2/2] RUN pacman -Syu --noconfirm --needed make clang gtest && pacman -Scc --noconfirm && rm -rf /var/cache/pacman/pkg/*:
0.190 :: Synchronizing package databases...
0.197 error: error restricting syscalls via seccomp: 22!
0.197 error: switching to sandbox user 'alpm' failed!
0.197 error: failed to synchronize all databases (failed to retrieve some files)
------
Dockerfile:3
--------------------
2 |
3 | >>> RUN pacman -Syu --noconfirm --needed make clang gtest \
4 | >>> && pacman -Scc --noconfirm \
5 | >>> && rm -rf /var/cache/pacman/pkg/*
6 |
--------------------
ERROR: failed to build: failed to solve: process "/bin/sh -c pacman -Syu --noconfirm --needed make clang gtest && pacman -Scc --noconfirm && rm -rf /var/cache/pacman/pkg/*" did not complete successfully: exit code: 1
解決策
pacman に --disable-sandbox-syscalls オプションを付けると解消した.
FROM archlinux
- RUN pacman -Syu --noconfirm --needed make clang gtest \
+ RUN pacman -Syu --noconfirm --needed --disable-sandbox-syscalls make clang gtest \
&& pacman -Scc --noconfirm \
&& rm -rf /var/cache/pacman/pkg/*
--disable-sandbox-syscalls オプション
pacman のマニュアルページには以下 3 つの sandbox 無効化オプションの説明あり.
| オプション | 無効化される機能 |
|---|---|
--disable-sandbox-syscalls |
seccomp による syscall フィルタリングのみ |
--disable-sandbox-filesystem |
Landlock によるファイルシステム制限のみ |
--disable-sandbox |
上記両方(完全無効化) |
今回の問題は seccomp のみが原因のため, --disable-sandbox-syscalls を使うことにより, ファイルシステム制限の方は引き続き有効に保てる.
原因
そもそも seccomp, alpm ってなんやねん状態のため, 興味本位で少し調べてみた簡単メモ.
pacman のサンドボックス機能
pacman はバージョン 7.0 以降, パッケージのダウンロード処理にサンドボックスを導入している.
ダウンロード処理を専用のシステムユーザー alpm に切り替えて実行し,
以下の 2 つの仕組みで制限をかける (seccomp フィルタリングは 7.1 で 2025/11 ごろに追加).
- seccomp (システムコールのサンドボックス): ダウンロードプロセスが呼び出せるシステムコールを BPF フィルタで制限する Linuxカーネルのセキュリティ機能
- Landlock (ファイルシステムのサンドボックス): ダウンロードプロセスがアクセスできるファイルシステムのパスを制限する Linux カーネルのセキュリティ機能
QEMU エミュレーション環境での発生原因
Apple シリコン上で AMD64 の Docker コンテナを動かすには, QEMU による CPU エミュレーションが必要.
実カーネルは ARM であるため, AMD64 向けに seccomp フィルタを設定できず, EINVAL (Invalid Argument) でエラーコード 22 が返る.
(らしい.)
確認環境
| ソフトウェア | バージョン |
|---|---|
| pacman | 7.1.0 |
| Docker Desktop for Mac | 4.62.0 |
| macOS | Sequoia 15.7.4 |