#!/bin/sh # Reproduce: containerd-snapshotter pull-through mirror referrers failure # # Prerequisites: Docker Engine installed, root access # This script: # 1. Starts a pull-through registry mirror for Docker Hub # 2. Enables containerd-snapshotter # 3. Configures Docker to use the mirror via hosts.toml # 4. Pulls an image — fails with "failed to decode referrers index" # # Run as root. set -eu MIRROR_PORT=5555 MIRROR_NAME=registry-mirror-test cleanup() { echo "==> Cleaning up" docker rm -f "$MIRROR_NAME" 2>/dev/null || true rm -rf /etc/docker/certs.d/docker.io rm -f /tmp/mirror-config.yml # Restore daemon.json if [ -f /etc/docker/daemon.json.bak ]; then mv /etc/docker/daemon.json.bak /etc/docker/daemon.json else rm -f /etc/docker/daemon.json fi systemctl restart docker 2>/dev/null || true } trap cleanup EXIT echo "==> Step 1: Start pull-through registry mirror" cat > /tmp/mirror-config.yml </dev/null || true docker run -d \ --name "$MIRROR_NAME" \ -p "${MIRROR_PORT}:5000" \ -v /tmp/mirror-config.yml:/etc/docker/registry/config.yml:ro \ registry:2 echo " Waiting for mirror to start..." sleep 3 echo "==> Step 2: Enable containerd-snapshotter" if [ -f /etc/docker/daemon.json ]; then cp /etc/docker/daemon.json /etc/docker/daemon.json.bak fi cat > /etc/docker/daemon.json < Step 3: Configure mirror via hosts.toml" mkdir -p /etc/docker/certs.d/docker.io cat > /etc/docker/certs.d/docker.io/hosts.toml < Step 4: Restart Docker" systemctl restart docker sleep 3 echo "==> Step 5: Remove cached image and pull through mirror" docker image rm alpine:latest 2>/dev/null || true echo " Pulling alpine:latest..." if docker pull alpine:latest; then echo " PASS: Pull succeeded (issue may be fixed)" else echo " FAIL: Pull failed with referrers error (issue reproduced)" fi echo echo "==> Docker version:" docker version --format '{{.Server.Version}}' echo "==> Storage driver:" docker info --format '{{.Driver}}'