Lesstep
GitHub Actions・Ubuntu 26.04・2026年11月4日に確認

ubuntu-latest(Ubuntu 26.04)の kind load docker-image:「ctr: content digest ... not found」と Docker 29 の containerd イメージストア

ubuntu-latest は、2026年10月19日から11月19日にかけて Ubuntu 24.04 から 26.04 に移ります(ほかに変わること)。26.04 のイメージの Docker は 29.4.2、24.04 は 28.0.4 です。Docker 29 は既定で containerd イメージストアを使い(docker info に io.containerd.snapshotter.v1 と出ます)、kind load docker-image で kind のクラスターにイメージを入れておくジョブは、準備のステップで止まります。

メッセージ

api7-ingress-controller #504 からです。ここでは e2e と適合性のジョブがすべて、テストが始まる前に落ちました:

ERROR: failed to load image: command "docker exec --privileged -i kind-control-plane ctr --namespace=k8s.io images import --all-platforms --digests --snapshotter=overlayfs -" failed with error: exit status 1
Command Output: ctr: rpc error: code = NotFound desc = content digest sha256:08d3b285700dffd91925e9d6328690d3336ac3adf6539aab94988bcecd727715: not found

nginx や busybox のようなマルチプラットフォームのイメージを pull すると、containerd イメージストアはインデックス全体を持ちますが、中身はランナーのプラットフォームの分だけです。kind load docker-image はイメージを保存して --all-platforms で読み込むので、ほかのプラットフォームの分を探し、最初に足りないブロブで落ちます。kind の issue は kind #3795 で、11月4日の時点でまだ開いています。api7 によれば kind v0.33.0 も kind の main ブランチも同じ読み込み方なので、kind を上げても直りません。datum-cloud/test-infra #84 によれば、ランナーでビルドした1つのプラットフォームのイメージは今も読み込めます。壊れるのはレジストリから pull したマルチプラットフォームのイメージです。

直し方1:1つのプラットフォームのアーカイブを読み込む

kind の既知の問題は、これを的を絞った直し方として載せています。ノードが動くプラットフォームの分だけを保存して、そのアーカイブを読み込みます:

docker image save --platform linux/amd64 --output /tmp/image.tar my-image:tag
kind load image-archive /tmp/image.tar --name my-cluster

Arm64 のランナーでは linux/arm64 にします。docker image save --platform は Docker 28 以降が必要なので、古い Docker でも動かすスクリプトは、ストアが切れているときは kind load docker-image のままにしておけます。api7 の Makefile がこうしています。datum-cloud が見つけた落とし穴が1つあります。ランナーでビルドしたイメージだと、Docker 29.4.2 のアーカイブにはビルドの証明(attestation)も入っていて、kind はそれを余分なイメージとして読み込みます。

直し方2:containerd イメージストアを切る

Docker を 24.04 のときの状態に戻します。ランナーの /etc/docker/daemon.json は上書きせずに設定を足し、Docker を再起動して、ストアが変わったかを確かめます。datum-cloud のステップです:

- name: Use Docker's classic image store
  run: |
    set -euo pipefail
    sudo mkdir -p /etc/docker
    cfg='{}'
    if sudo test -s /etc/docker/daemon.json; then cfg=$(sudo cat /etc/docker/daemon.json); fi
    echo "$cfg" | jq '.features["containerd-snapshotter"] = false' | sudo tee /etc/docker/daemon.json >/dev/null
    sudo systemctl restart docker
    if docker info --format '{{ .DriverStatus }}' | grep -q io.containerd.snapshotter; then
      echo "the containerd image store is still on"
      exit 1
    fi

このステップは、イメージを pull やビルドするより前に置きます。containerd ストアにあるイメージは、再起動のあと従来のストアからは見えません。skywalking-helm #204 には、固定していたテスト用のツールがこのような再起動をして、SkyWalking の Java の E2E でローカルにビルドしたイメージが見えなくなり、「pull access denied」で落ちた話があります。同じ理由で datum-cloud は、このステップを自分のジョブに置き、イメージを用意してから呼ばれることもある共有のアクションには入れませんでした。spiderpool #5854 も e2e のジョブで同じ設定を使っています。そこでは、sudo なしで systemctl restart docker を動かしていたやり直しの処理も直しています。新しいランナーでは「Access denied」で失敗するためです。

見分け方

26.04 のほかの失敗

失敗したジョブを 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. の商標、Kubernetes は The Linux Foundation の登録商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・Canonical・Docker, Inc.・The Linux Foundation・JetBrains のいずれとも提携しておらず、承認も受けていません。

ほかに:「The ubuntu-latest label will migrate to Ubuntu 26」 · Ubuntu 26.04 の /etc/sysctl.conf · 「No space left on device」 · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English