Visitar URL original
docker save gives Error response from daemon: no suitable export target found: · Issue #7278 · docker/cli · GitHub
Skip to content

docker save gives Error response from daemon: no suitable export target found: #7278

Description

@iraj-jelo

Description

Hi there,

I'm trying to pull an image in my docker and then import it in my Kubernetes cluster's nodes (build by Kind). the pulls seem successful.

$ docker pull --platform=linux/amd64 kserve/llmisvc-controller:v0.20.0
v0.20.0: Pulling from kserve/llmisvc-controller
Digest: sha256:d502b5b56713b12d0e04127cdea76bd935402a0d7870d3c30dbf730349d86a95
Status: Image is up to date for kserve/llmisvc-controller:v0.20.0
docker.io/kserve/llmisvc-controller:v0.20.0

But when I import them in Kind nodes:

$ docker save --platform="linux/amd64" "kserve/llmisvc-controller:v0.20.0" | docker exec --privileged -i "cluster-demo-worker2" ctr --namespace=k8s.io images import --snapshotter=overlayfs -
Error response from daemon: no suitable export target found: image with reference kserve/llmisvc-controller:v0.20.0 was found but does not provide the specified platform (linux/amd64)
ctr: unrecognized image format

Reproduce

docker pull --platform=linux/amd64 kserve/llmisvc-controller:v0.20.0
docker save --platform="linux/amd64" "kserve/llmisvc-controller:v0.20.0" | echo

Expected behavior

No response

docker version

Client:
 Version:           29.7.2
 API version:       1.55
 Go version:        go1.26.5
 Git commit:        a7dcaa6
 Built:             Wed Aug  5 18:31:33 2026
 OS/Arch:           windows/amd64
 Context:           desktop-linux

Server: Docker Desktop 4.89.0 (238018)
 Engine:
  Version:          29.7.2
  API version:      1.55 (minimum version 1.40)
  Go version:       go1.26.5
  Git commit:       6a43e3d
  Built:            Wed Aug  5 18:28:36 2026
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v2.3.3
  GitCommit:        aad11006b869517fcd3009450b6f82da282e1a9b
 runc:
  Version:          1.4.3
  GitCommit:        v1.4.3-0-gbb14dabe
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

docker info

Client:
 Version:    29.7.2
 Context:    desktop-linux
 Debug Mode: false
 Plugins:
  agent: Docker AI Agent Runner (Docker Inc.)
    Version:  v1.127.0
    Path:     C:\Users\C1\.docker\cli-plugins\docker-agent.exe
  ai: Docker AI Agent - Ask Gordon (Docker Inc.)
    Version:  v1.30.0
    Path:     C:\Users\C1\.docker\cli-plugins\docker-ai.exe
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.36.1-desktop.1
    Path:     C:\Users\C1\.docker\cli-plugins\docker-buildx.exe
  compose: Docker Compose (Docker Inc.)
    Version:  v5.5.0
    Path:     C:\Users\C1\.docker\cli-plugins\docker-compose.exe
  debug: Get a shell into any image or container (Docker Inc.)
    Version:  0.0.47
    Path:     C:\Users\C1\.docker\cli-plugins\docker-debug.exe
  desktop: Docker Desktop commands (Docker Inc.)
    Version:  v0.4.3
    Path:     C:\Users\C1\.docker\cli-plugins\docker-desktop.exe
  dhi: CLI for managing Docker Hardened Images (Docker Inc.)
    Version:  v0.0.7
    Path:     C:\Users\C1\.docker\cli-plugins\docker-dhi.exe
  extension: Manages Docker extensions (Docker Inc.)
    Version:  v0.2.31
    Path:     C:\Users\C1\.docker\cli-plugins\docker-extension.exe
  init: Creates Docker-related starter files for your project (Docker Inc.)
    Version:  v1.4.0
    Path:     C:\Users\C1\.docker\cli-plugins\docker-init.exe
  mcp: Docker MCP Plugin (Docker Inc.)
    Version:  v0.43.3
    Path:     C:\Users\C1\.docker\cli-plugins\docker-mcp.exe
  model: Docker Model Runner (Docker Inc.)
    Version:  v1.2.6
    Path:     C:\Users\C1\.docker\cli-plugins\docker-model.exe
  offload: Docker Offload (Docker Inc.)
    Version:  v0.6.13
    Path:     C:\Users\C1\.docker\cli-plugins\docker-offload.exe
  pass: Docker Pass Secrets Manager Plugin (beta) (Docker Inc.)
    Version:  v0.2.2
    Path:     C:\Users\C1\.docker\cli-plugins\docker-pass.exe
  sandbox: "docker sandbox" is deprecated, use Docker Sandboxes instead (Docker Inc.)
    Version:  v0.13.0
    Path:     C:\Users\C1\.docker\cli-plugins\docker-sandbox.exe
  scout: Docker Scout (Docker Inc.)
    Version:  v1.24.0
    Path:     C:\Users\C1\.docker\cli-plugins\docker-scout.exe

Server:
 Containers: 6
  Running: 3
  Paused: 3
  Stopped: 0
 Images: 52
 Server Version: 29.7.2
 Storage Driver: overlayfs
  driver-type: io.containerd.snapshotter.v1
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 CDI spec directories:
  /etc/cdi
  /var/run/cdi
 Discovered Devices:
  cdi: docker.com/gpu=webgpu
 Swarm: inactive
 Runtimes: nvidia runc io.containerd.runc.v2
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: aad11006b869517fcd3009450b6f82da282e1a9b
 runc version: v1.4.3-0-gbb14dabe
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
  cgroupns
 Kernel Version: 6.6.87.2-microsoft-standard-WSL2
 Operating System: Docker Desktop
 OSType: linux
 Architecture: x86_64
 CPUs: 12
 Total Memory: 31.02GiB
 Name: docker-desktop
 ID: 0b9e8bc1-b125-496b-bcaf-b6b579a96379
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 HTTP Proxy: http.docker.internal:3128
 HTTPS Proxy: http.docker.internal:3128
 No Proxy: hubproxy.docker.internal
 Labels:
  com.docker.desktop.address=npipe://\\.\pipe\docker_cli
 Experimental: false
 Insecure Registries:
  hubproxy.docker.internal:5555
  ::1/128
  127.0.0.0/8
 Live Restore Enabled: false
 Firewall Backend: iptables

Additional Info

Some context information:

$ docker image inspect   kserve/llmisvc-controller:v0.20.0   --format '{{.Os}}/{{.Architecture}}'
linux/amd64
$ docker image ls --tree \
  kserve/llmisvc-controller:v0.20.0
                                                                                                                                                                                             
IMAGE                               ID             DISK USAGE   CONTENT SIZE   EXTRA
kserve/llmisvc-controller:v0.20.0   d502b5b56713        185MB           50MB
├─ linux/amd64                      4bf78942d500        184MB         49.1MB
├─ linux/arm/v7                     be6453e834ba           0B             0B
├─ linux/arm64                      e0963c6adc62           0B             0B
├─ linux/ppc64le                    ff7e02dc8f4e           0B             0B
└─ linux/s390x                      dcfa3ce26f74           0B             0B

Note that the above output for linux/amd64 seems not to be valid, as it's printed with gray color font:

Image
$ docker buildx imagetools inspect kserve/llmisvc-controller:v0.20.0

Name:      docker.io/kserve/llmisvc-controller:v0.20.0
MediaType: application/vnd.oci.image.index.v1+json
Digest:    sha256:d502b5b56713b12d0e04127cdea76bd935402a0d7870d3c30dbf730349d86a95

Manifests:
  Name:        docker.io/kserve/llmisvc-controller:v0.20.0@sha256:4bf78942d5009b2684decfe68d8f1c904b4a0f41711ec750869f16df0fd7ef29
  MediaType:   application/vnd.oci.image.manifest.v1+json
  Platform:    linux/amd64

  Name:        docker.io/kserve/llmisvc-controller:v0.20.0@sha256:be6453e834ba2fe6d797395c8e43ea42f011694b0d88ac2870075e94327d1222
  MediaType:   application/vnd.oci.image.manifest.v1+json
  Platform:    linux/arm/v7

  Name:        docker.io/kserve/llmisvc-controller:v0.20.0@sha256:e0963c6adc62593ada575cfb8224127ee50d335dd469f24be1093bbf68ab7cbb
  MediaType:   application/vnd.oci.image.manifest.v1+json
  Platform:    linux/arm64

  Name:        docker.io/kserve/llmisvc-controller:v0.20.0@sha256:ff7e02dc8f4e96eaf24371794225df0140d4309dfc7f6b498cbd9663e9c26b9e
  MediaType:   application/vnd.oci.image.manifest.v1+json
  Platform:    linux/ppc64le

  Name:        docker.io/kserve/llmisvc-controller:v0.20.0@sha256:dcfa3ce26f74bdaf669173b41ec20cdc3048f31d66dc046eb7f4d3ae2449c79c
  MediaType:   application/vnd.oci.image.manifest.v1+json
  Platform:    linux/s390x

  Name:        docker.io/kserve/llmisvc-controller:v0.20.0@sha256:1a38319dea7cee5ee5dee08192261cc0dde56af6d694155363b8059407259a2a
  MediaType:   application/vnd.oci.image.manifest.v1+json
  Platform:    unknown/unknown
  Annotations:
    vnd.docker.reference.digest: sha256:4bf78942d5009b2684decfe68d8f1c904b4a0f41711ec750869f16df0fd7ef29
    vnd.docker.reference.type:   attestation-manifest

  Name:        docker.io/kserve/llmisvc-controller:v0.20.0@sha256:1cb484a64e3299f93ec131420198b306838f564750b5c482d3906c3af40023dd
  MediaType:   application/vnd.oci.image.manifest.v1+json
  Platform:    unknown/unknown
  Annotations:
    vnd.docker.reference.digest: sha256:be6453e834ba2fe6d797395c8e43ea42f011694b0d88ac2870075e94327d1222
    vnd.docker.reference.type:   attestation-manifest

  Name:        docker.io/kserve/llmisvc-controller:v0.20.0@sha256:9183b01ba342ffbcc15c67abfed6d163ebedf1aa02ec500f6db51a5c5f768082
  MediaType:   application/vnd.oci.image.manifest.v1+json
  Platform:    unknown/unknown
  Annotations:
    vnd.docker.reference.type:   attestation-manifest
    vnd.docker.reference.digest: sha256:e0963c6adc62593ada575cfb8224127ee50d335dd469f24be1093bbf68ab7cbb

  Name:        docker.io/kserve/llmisvc-controller:v0.20.0@sha256:db621d21a6f8587a951b28ade6a7bd231d8c8d62b51c2a85607391fe3d9ee91b
  MediaType:   application/vnd.oci.image.manifest.v1+json
  Platform:    unknown/unknown
  Annotations:
    vnd.docker.reference.digest: sha256:ff7e02dc8f4e96eaf24371794225df0140d4309dfc7f6b498cbd9663e9c26b9e
    vnd.docker.reference.type:   attestation-manifest

  Name:        docker.io/kserve/llmisvc-controller:v0.20.0@sha256:6483d021538ad1a55dbdbbdbc7faaf911cf560ad7c5ed00723b418ea08cd261b
  MediaType:   application/vnd.oci.image.manifest.v1+json
  Platform:    unknown/unknown
  Annotations:
    vnd.docker.reference.digest: sha256:dcfa3ce26f74bdaf669173b41ec20cdc3048f31d66dc046eb7f4d3ae2449c79c
    vnd.docker.reference.type:   attestation-manifest

Activity

  1. thaJeztah commented on Sep 2, 2026

    @thaJeztah
    Member

    What version of containerd is running inside the container? There may be some issues if the platform is not the native platform, but trying to reproduce, I don't get the error;

    docker pull --platform=linux/amd64 kserve/llmisvc-controller:v0.20.0
    docker run -d --rm --name dind --privileged docker:dind
    docker save --platform="linux/amd64" "kserve/llmisvc-controller:v0.20.0" | docker exec --privileged -i "dind" ctr --address /var/run/docker/containerd/containerd.sock --namespace=k8s.io images import --snapshotter=overlayfs -
    docker.io/kserve/llmisvc controller:v0.2	saved
    application/vnd.oci.image.manifest.v1+json sha256:4bf78942d5009b2684decfe68d8f1c904b4a0f41711ec750869f16df0fd7ef29
    Importing	elapsed: 0.8 s	total:   0.0 B	(0.0 B/s)
    docker exec --privileged -i "dind" ctr --address /var/run/docker/containerd/containerd.sock --namespace=k8s.io images ls
    REF                                         TYPE                                       DIGEST                                                                  SIZE     PLATFORMS LABELS
    docker.io/kserve/llmisvc-controller:v0.20.0 application/vnd.oci.image.manifest.v1+json sha256:4bf78942d5009b2684decfe68d8f1c904b4a0f41711ec750869f16df0fd7ef29 46.9 MiB -         -
    time="2026-09-02T16:01:52Z" level=error msg="failed resolving platform for image docker.io/kserve/llmisvc-controller:v0.20.0" error="content digest sha256:76953e89391382ee3fbecb0b41c1d87e45eb86f796c36eaccafcf73c90ca5f66: not found"
  2. mukeshbhandarkar commented on Sep 4, 2026

    @mukeshbhandarkar

    @thaJeztah, @iraj-jelo I dug into this a bit further, and I think we can narrow down what to check next.

    The docker save --platform=linux/amd64 error comes from Moby's single-platform export selection path. For the requested platform, Moby only accepts the manifest if the manifest, config, and required layers are readable from the local content store.

    I also mapped the digest from the later ctr images ls error:

    sha256:76953e89391382ee3fbecb0b41c1d87e45eb86f796c36eaccafcf73c90ca5f66

    That digest is not attestation content. It is the OCI image config referenced directly by the linux/amd64 manifest:

    • index: sha256:d502b5b56713b12d0e04127cdea76bd935402a0d7870d3c30dbf730349d86a95
    • amd64 manifest: sha256:4bf78942d5009b2684decfe68d8f1c904b4a0f41711ec750869f16df0fd7ef29
    • amd64 config: sha256:76953e89391382ee3fbecb0b41c1d87e45eb86f796c36eaccafcf73c90ca5f66

    I tested the relevant selection behavior on both current Moby HEAD and the exact docker-v29.7.2 release.

    A complete linux/amd64 image is still selected successfully when a sibling BuildKit attestation has missing content. As a control, removing a blob required by the actual amd64 image makes the selector reject that platform as expected.

    So at least from that test, an incomplete attestation sibling does not seem to be what is causing the platform-not-found error.

    One detail that seems important: in @thaJeztah's reproduction, docker save and ctr images import both completed successfully before the missing 76953e... config was reported by ctr images ls. That means the missing-config message there is from the destination containerd state; it doesn't by itself show that the config was missing from the reporter's source Docker Desktop daemon before docker save.

    @iraj-jelo, could you run these immediately before the failing docker save?

    $image = 'kserve/llmisvc-controller:v0.20.0'
    
    docker image inspect `
      --platform=linux/amd64 `
      --format '{{json .ManifestDescriptor}}' `
      $image
    
    docker image ls --tree $image
    
    docker image save `
      --platform=linux/amd64 `
      --output llmisvc-controller.tar `
      $image

    In particular, it would be useful to know whether the platform-specific inspect succeeds immediately before save, and what image ls --tree reports for linux/amd64.

    If inspect --platform=linux/amd64 succeeds but the immediately following save --platform=linux/amd64 still reports that the image does not provide that platform, that would be especially interesting because both operations should be able to read the amd64 config at that point.

    There is also a lower-level containerd content-store check we could do if necessary, but since Docker Desktop's internal containerd interface is not a stable user-facing API, I think the Engine-level checks above are a better first step.

  3. iraj-jelo commented on Sep 4, 2026

    @iraj-jelo
    Author

    @thaJeztah thanks so much for your help. you mean the version of containerd running inside the container of kserve/llmisvc-controller:v0.20.0? actually I don't know. I'm going to run that container indirectly inside a Kind cluster as a service of Kubeflow services.
    I tried to run the following command in the respective node to inspect containerd version for the pod container, but it failed:

    # crictl exec 9c147df66c31a "containerd --version"
    FATA[0000] execing command in container 9c147df66c31a: Internal error occurred: error executing command in container: failed to exec in
    container: failed to start exec "b753362d8e8dfbb0bc283f345a9e8d955a3758a7448ec28cfee5dff2ef9dc1b1": OCI runtime exec failed: exec
    failed: unable to start container process: exec: "containerd --version": executable file not found in $PATH
  4. iraj-jelo commented on Sep 4, 2026

    @iraj-jelo
    Author

    @mukeshbhandarkar , thanks for your help! yes, of course.

    Your first suggested command failed due to the missing key "ManifestDescriptor" in json response:

    $ docker image inspect   --platform=linux/amd64   --format "{{ json .ManifestDescriptor}}"   $image
    
    template parsing error: template: :1:8: executing "" at <.ManifestDescriptor>: map has no entry for key "ManifestDescriptor"

    The whole response of docker image inspect --platform=linux/amd64 $image without formatting is like this:

    [
        {
            "Id": "sha256:4bf78942d5009b2684decfe68d8f1c904b4a0f41711ec750869f16df0fd7ef29",
            "RepoTags": [
                "kserve/llmisvc-controller:v0.20.0"
            ],
            "RepoDigests": [
                "kserve/llmisvc-controller@sha256:d502b5b56713b12d0e04127cdea76bd935402a0d7870d3c30dbf730349d86a95"
            ],
            "Comment": "buildkit.dockerfile.v0",
            "Created": "2026-08-07T00:13:53.486986239Z",
            "Config": {
                "User": "65532",
                "Env": [
                    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                    "SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt"
                ],
                "Entrypoint": [
                    "/manager"
                ],
                "WorkingDir": "/home/nonroot"
            },
            "Architecture": "amd64",
            "Os": "linux",
            "Size": 49214977,
            "RootFS": {
                "Type": "layers",
                "Layers": [
                    "sha256:50abe06dfc0957e14cb8332ed242e8b884ef2563a9eb202e5172f243f62792f7",
                    "sha256:621c35e751a51a9a9dc3e80aa0b7fe8be2a93402ea6ccd307d30852cd7776cda",
                    "sha256:c8b007d0206e4b10ed4d3b3d99dfeab47c2648e82011989fd78a5731baf33fc3",
                    "sha256:bec7e6bb35e05d1284f28b10d2150c259717d91c658c4c10c08424bb9466caba",
                    "sha256:275a30dd8ce958b21daa9ad962c6fbc09f98306ee2f486b65c9075dc257b1412",
                    "sha256:4d049f83d9cf21d1f5cc0e11deaf36df02790d0e60c1a3829538fb4b61685368",
                    "sha256:af5aa97ebe6ce1604747ec1e21af7136ded391bcabe4acef882e718a87c86bcc",
                    "sha256:6f1cdceb6a3146f0ccb986521156bef8a422cdbb0863396f7f751f575ba308f4",
                    "sha256:bd3cdfae1d3fdd83a2231d608969b38b82349777c2fff9a7c12d54f8ac5c9b38",
                    "sha256:4cde6b0bb6f50a5f255eef7b2a42162c661cf776b803225dcac9a659e396bb6b",
                    "sha256:ad51d0769d16ba578106a177987dfe3d2e02c1668c852b795b2f6b024068242a",
                    "sha256:187cfc6d1e3e8a40a5e64653bcd3239c140807dcf1c09e48021178705a5a6139",
                    "sha256:5fd2536c39c0700be8b7b4344e375196da2f126842fd8ede66996a18860a3890",
                    "sha256:06f079ef312dd96058e826c7df662acc6b009c6f996352fb265e8d35462db698",
                    "sha256:e44323d2dcb3ab81db82ffc82bc76eb661e3f1ae8bed11bb2e177fb797862909"
                ]
            },
            "Metadata": {
                "LastTagTime": "2026-09-02T17:16:54.990178764Z"
            },
            "Descriptor": {
                "mediaType": "application/vnd.oci.image.manifest.v1+json",
                "digest": "sha256:4bf78942d5009b2684decfe68d8f1c904b4a0f41711ec750869f16df0fd7ef29",
                "size": 3129,
                "platform": {
                    "architecture": "amd64",
                    "os": "linux"
                }
            },
            "Identity": {
                "Pull": [
                    {
                        "Repository": "docker.io/kserve/llmisvc-controller"
                    }
                ]
            }
        }
    ]

    and the response of your second suggested command (for this one, also check the screenshot I upload earlier in Additional Info section of my report. it seems suspicious):

    $ docker image ls --tree $image
    
    IMAGE                               ID             DISK USAGE   CONTENT SIZE   EXTRA
    kserve/llmisvc-controller:v0.20.0   d502b5b56713        184MB         49.2MB
    ├─ linux/amd64                      4bf78942d500        184MB         48.4MB
    ├─ linux/arm/v7                     be6453e834ba           0B             0B
    ├─ linux/arm64                      e0963c6adc62           0B             0B
    ├─ linux/ppc64le                    ff7e02dc8f4e           0B             0B
    └─ linux/s390x                      dcfa3ce26f74           0B             0B
    
    $ docker image save \
      --platform=linux/amd64 \
      --output llmisvc-controller.tar \
      $image
    Error response from daemon: no suitable export target found: image with reference kserve/llmisvc-controller:v0.20.0 was found but does not provide the specified platform (linux/amd64)
  5. mukeshbhandarkar commented on Sep 4, 2026

    @mukeshbhandarkar

    @iraj-jelo Thanks, the latest output narrows this down significantly.

    The important observation is that, immediately before the failure:

    • docker image inspect --platform=linux/amd64 successfully resolves the AMD64 manifest (sha256:4bf78942d500...) and its image metadata/RootFS;
    • docker image ls --tree also sees the AMD64 platform;
    • but docker image save --platform=linux/amd64 rejects that same platform.

    Looking through the containerd image-store paths, these operations have different completeness requirements. Platform-specific inspect can return metadata for an image even when some of its compressed layer content is unavailable locally. Explicit-platform save is stricter: the selected manifest, config, and layer blobs must all be available for export.

    That makes this consistent with an incomplete local content closure rather than the AMD64 platform actually being absent.

    There is also a potentially related containerd behavior tracked in containerd/containerd#8973: during pull+unpack, an existing chain-ID snapshot can cause fetching of the corresponding compressed blob to be skipped. The unpacked image can remain usable while operations that require the original packed content later fail. Moby #52193 appears to report a very similar Docker Desktop/containerd-image-store pull → save failure.

    I don't think we have enough evidence yet to say that this is definitely the cause here, though. In particular, we have not identified a missing AMD64 layer digest on your daemon.

    I would avoid removing/re-pulling the image for now, since that could destroy the state that makes this reproducible.

    If a maintainer has a preferred supported way to inspect per-manifest content availability on Docker Desktop/Windows, that would be the most useful next diagnostic.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions