「can't initialize iptables table `nat'」:Ubuntu 26.04 の Docker-in-Docker
ubuntu-latest は、2026年10月19日から11月19日にかけて Ubuntu 24.04 から 26.04 に移ります(ほかに変わること)。26.04 のイメージのカーネルは 7.0 で、古い iptables のテーブルをモジュールとして持ち、読み込んではいません:ip_tables・iptable_filter・iptable_nat・ip6_tables・ip6table_filter。24.04 では読み込まれていました。ランナー自身の Docker は nftables を使うので問題ありませんが、iptables-legacy を呼ぶコンテナはこれらを読み込めず、その中の dockerd は最初の NAT のルールで止まります。
どう見えるか
dev container の docker-in-docker 機能では、ジョブのログに出るのはやり直しの行が4回だけです:
(*) Failed to start docker, retrying... (*) Failed to start docker, retrying... (*) Failed to start docker, retrying... (*) Failed to start docker, retrying... Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
理由はコンテナの中の /tmp/dockerd.log にあります。機能の docker-init.sh が書き、どこにも表示されません:
failed to start daemon: Error initializing network controller: ... failed to create NAT chain DOCKER: iptables v1.8.11 (legacy): can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
コンテナの中で自分で iptables-legacy を呼んでも、nat が filter になるだけで同じように落ちます。
機能が legacy を選ぶわけ
機能の版 2 と 3 は、iptables の切り替えをイメージのビルドのときに、イメージ自身のディストリビューションで決めます。iptables-nft になるのはイメージ自身が Ubuntu 26.04 のときだけで、Debian の bookworm・trixie や Ubuntu 22.04・24.04 を含むほかはすべて iptables-legacy です。:2 のタグは2026年5月の 2.17.0、:3 は 3.1.0 で止まっているので、どちらにもあとの直しは届きません。4.0.0(2026年6月)は、この選択をコンテナの起動のときに移し(iptablesSwitchAtRuntime・既定で有効)、ホストで ip_tables が読み込まれているときだけ legacy を使います(devcontainers/features #1666)。
報告のあったもの
python:3.14-bookwormの dev container と 2.17.0 に固定したdocker-in-docker:2:24.04 のイメージ 20261025.353.1 では通り、26.04 のイメージ 20261025.179.1 では毎回、やり直しの行が4回出たあとpgrep -x dockerdで落ちました(docker-autoheal #143)。- この機能を使うプロジェクトは、上の
natのテーブルの行を、コンテナの中の/tmp/dockerd.logを読んで初めて見つけました(container-base #225)。 ubuntu-latest(26.04・カーネル 7.0)での調べの実行:CONFIG_IP_NF_IPTABLES_LEGACY=mで、iptable_filter.koはあるのに読み込まれておらず、ホストでsudo modprobe iptable_filterを実行するまでコンテナの中のiptables-legacyは落ちました(aios #2567)。
直し方:機能を版 4 に上げる
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:4": {}
}
リポジトリに devcontainer-lock.json があれば、その docker-in-docker の項目も更新します。そこには正確な版とダイジェストがあり、落ちたプロジェクトのロックは 2.17.0 のままでした。ビルド済みの dev container のイメージは、作り直すまで古い選択のままです。コンテナのエントリポイントが root 以外のユーザーで動くなら、4.1.3 以降を使います(#1747)。2 から 4 はメジャーの版を2つ越えるので、切り替える前に機能のオプションを読んでおきます。
または、ランナーでモジュールを読み込む
- run: sudo modprobe -a ip_tables iptable_filter iptable_nat ip6_tables ip6table_filter
コンテナを起動するステップより前に実行します。機能だけでなく、iptables-legacy を使うどのコンテナにも効き、aios #2567 のプロジェクトは CI でこうしています。セルフホストの 26.04 のホストなら、5つのモジュールを並べたファイルを /etc/modules-load.d/ に置いて、起動のときに読み込みます。
ジョブを runs-on: ubuntu-24.04 に固定しても動きます。GitHub がそのイメージを終えるまでは使えます。
見分け方
- ランナーで
lsmod | grep -E '^(ip_tables|iptable_nat) 'を実行すると、26.04 では何も出ません。 - コンテナの中の
iptables --versionは(legacy)か(nf_tables)と出ます。ログに(nf_tables)と出て落ちる dockerd は、別の問題です。 - 「Set up job」の Runner Image のグループにイメージが出ます。11月19日までは、再実行がもう一方のイメージに当たることがあるので、再実行が緑でも何も確かめたことになりません。
ほかの 26.04 の失敗
- Ubuntu 26.04 の pg_dump 18:イメージと apt の PostgreSQL が 18 なので、ダンプが
SET transaction_timeout = 0で始まり、PostgreSQL 16 のサービスが「unrecognized configuration parameter」で断ります。 - Ubuntu 26.04 の Docker で Postgres が起動しない:7.0.0-42 などの新しいカーネルはコンテナのプロセスを
docker-default//&unconfinedとして動かすので、プロセスどうしでシグナルを送れず、gosuが CPU 100% で止まります。いまのところ報告はセルフホストのランナーです。 - Ubuntu 26.04 の「client version ... is too old」:Docker 29 は API 1.40 より古いクライアントを断るので、古い Testcontainers は「Could not find a valid Docker environment」で落ちます。
- Ubuntu 26.04 の apt:名前が変わった・無くなったパッケージ。
- 「coreutils: unknown program」:基本のコマンドのほとんどが uutils です。
失敗したジョブを IntelliJ IDEA から見るなら
Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べ、いまのブランチの実行はステータスバーに出ます。読むのは無料、失敗したジョブの再実行・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。
GitHub と GitHub Actions は GitHub, Inc. の商標、Ubuntu は Canonical Ltd. の商標、Docker は Docker, Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・Canonical・Docker, Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:「The ubuntu-latest label will migrate to Ubuntu 26」 · Ubuntu 26.04 の Docker で Postgres が起動しない · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English