为什么我不能拉取dockerhub中公开的docker镜像?

olhwl3o2  于 2023-06-21  发布在  Docker
关注(0)|答案(1)|浏览(147)

我构建了一个Docker镜像,并使用最新的标签将其推送到Docker Hub。它似乎在Docker Hub上是公共的,但我无法在远程机器上拉取映像。我收到以下错误:

Failed to pull image "sayinmehmet47/kitapkurdu-backend": rpc error: code = NotFound desc = failed to pull and unpack image "docker.io/sayinmehmet47/kitapkurdu-backend:latest": no match for platform in manifest: not found

实际上这是我在构建和推送过程中使用的命令

docker build -t sayinmehmet47/kitapkurdu-backend:latest .
docker push sayinmehmet47/kitapkurdu-backend:latest

这也是来自dockerhub的图片

我不明白为什么不能拔出来。它仍然是公开的,可以在此link进行验证。
这也是我的远程机器在牧场尝试拉它与此yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend-deployment
  namespace: kitapkurdu
spec:
  replicas: 1
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
        - name: backend
          image: sayinmehmet47/kitapkurdu-backend
          ports:
            - containerPort: 5000

但是当我使用另一个来自dockerhub的镜像时,我以同样的方式创建的,远程机器接受它并获得镜像。看到一个工作良好时,拉它

docker pull sayinmehmet47/event-bus

所以我得到了这个错误。我猜它在dockerhub中找不到图像。

zbsbpyhn

zbsbpyhn1#

这些图像的构建方式并不相同:

$ docker buildx imagetools inspect sayinmehmet47/kitapkurdu-backend:latest
Name:      docker.io/sayinmehmet47/kitapkurdu-backend:latest
MediaType: application/vnd.oci.image.index.v1+json
Digest:    sha256:c0d3a9b3ba06dd86dee9d529e5f20aa8011ed291de0ac00a0334fcdbc8a79e40
           
Manifests: 
  Name:        docker.io/sayinmehmet47/kitapkurdu-backend:latest@sha256:d886311782470fd65c1090b8e6ee667a6692101ecd5a275c7c4a0d480ddf38fe
  MediaType:   application/vnd.oci.image.manifest.v1+json
  Platform:    linux/arm64
               
  Name:        docker.io/sayinmehmet47/kitapkurdu-backend:latest@sha256:1b2d6e473aee211006bb38f40c54dd959738500fcd731f772ffb4f4062b12b6c
  MediaType:   application/vnd.oci.image.manifest.v1+json
  Platform:    unknown/unknown
  Annotations: 
    vnd.docker.reference.digest: sha256:d886311782470fd65c1090b8e6ee667a6692101ecd5a275c7c4a0d480ddf38fe
    vnd.docker.reference.type:   attestation-manifest

$ docker buildx imagetools inspect sayinmehmet47/event-bus
Name:      docker.io/sayinmehmet47/event-bus:latest
MediaType: application/vnd.docker.distribution.manifest.v2+json
Digest:    sha256:df6e170dc4bb85b2f952e3ac0b0131a52d2fb93e25f3a34d444067427d70c9d4

sayinmehmet47/kitapkurdu-backend:latest映像中发生的情况是,buildkit将SLSA出处作为第二个映像附加到unknown/unknown平台。由于带有的清单现在是一个多平台清单,运行时在清单列表中查找其平台,如果找不到,则无法运行映像。
对于sayinmehmet47/event-bus,它是一个简单的映像,而不是清单列表(OCI索引),因此运行时将尝试在不验证平台的情况下执行它。
您可以在buildx构建中禁用出处,以禁用unknown/unknown映像,并回退到应该与大多数运行时一起工作的单个平台映像:

docker buildx build --provenance=false ...

但是,更好的解决方案是构建映像以在多个平台上运行:

docker buildx build --platform linux/amd64,linux/arm64 ...

您将看到构建的性能受到影响,特别是如果它是使用CPU的qemu仿真而不是编译器交叉编译来实现的。

相关问题