Docker registry not getting used when trying to pull without the registry mirrors in the command line. Error: manifest unknown: manifest unknown

Docker registry not getting used when trying to pull without the registry mirrors in the command line. Error: manifest unknown: manifest unknown

我试图在不使用命令行中的注册表镜像的情况下从 Nexus 存储库中提取 docker 图像,但它抛出了一个错误。如果我在拉取中使用注册表镜像,它会成功,但图像名称不是我想要的。

我的 docker 版本是:

Docker version 20.10.8, build 3967b7d

我的 nexus 版本是

Sonatype Nexus Repository ManagerOSS 3.31.1-01

docker系统信息:

Insecure Registries:
  xxx.xxx.x.xxx:8083
  127.0.0.0/8

 Registry Mirrors:
  http://xxx.xxx.x.xxx:8083/

当我运行:sudo docker pull xxx.xxx.x.xxx:8083/mongo:4.2.3时,它成功并且调试信息是:

DEBU[2021-08-17T10:37:19.364681226-04:00] Calling HEAD /_ping                          
DEBU[2021-08-17T10:37:19.365301100-04:00] Calling POST /v1.41/images/create?fromImage=192.168.9.175%3A8083%2Fmongo&tag=4.2.3 
DEBU[2021-08-17T10:37:19.367151579-04:00] Trying to pull xxx.xxx.x.xxx:8083/mongo from https://xxx.xxx.x.xxx:8083 v2 
WARN[2021-08-17T10:37:19.374915464-04:00] Error getting v2 registry: Get https://xxx.xxx.x.xxx:8083/v2/: http: server gave HTTP response to HTTPS client 
INFO[2021-08-17T10:37:19.374944418-04:00] Attempting next endpoint for pull after error: Get https://xxx.xxx.x.xxx:8083/v2/: http: server gave HTTP response to HTTPS client 
DEBU[2021-08-17T10:37:19.374964188-04:00] Trying to pull xxx.xxx.x.xxx:8083/mongo from http://xxx.xxx.x.xxx:8083 v2 
DEBU[2021-08-17T10:37:19.398630498-04:00] Fetching manifest from remote                 digest="sha256:92814bb60dc673bb68b6aca0b24bcb8738d7b2c267b97ce62fa92adc3746a0ea" error="<nil>" remote="192.168.9.175:8083/mongo:4.2.3"
DEBU[2021-08-17T10:37:19.429454057-04:00] Pulling ref from V2 registry: xxx.xxx.x.xxx:8083/mongo:4.2.3 

当我 运行: sudo docker pull mongo:4.2.3 它无法从 Nexus 中提取图像并出现错误,并在下一次尝试时从 docker.io 中提取。调试信息如下:

DEBU[2021-08-17T10:26:25.078886904-04:00] Calling HEAD /_ping                          
DEBU[2021-08-17T10:26:25.079306196-04:00] Calling GET /v1.41/info                      
DEBU[2021-08-17T10:26:25.097994642-04:00] Calling POST /v1.41/images/create?fromImage=mongo&tag=4.2.3 
DEBU[2021-08-17T10:26:25.099642151-04:00] Trying to pull mongo from http://xxx.xxx.x.xxx:8083/ v2 
INFO[2021-08-17T10:26:25.116000813-04:00] **Attempting next endpoint for pull after error: manifest unknown: manifest unknown** 
DEBU[2021-08-17T10:26:25.116039299-04:00] Trying to pull mongo from https://registry-1.docker.io v2 
DEBU[2021-08-17T10:26:25.305043063-04:00] Fetching manifest from remote                 digest="sha256:58b25d51baa11a85b6aedf7c4e05710d12a27ddc2883e2692e7d58527d98bd73" error="<nil>" remote="docker.io/library/mongo:4.2.3"
DEBU[2021-08-17T10:26:25.360955030-04:00] Pulling ref from V2 registry: mongo:4.2.3    
DEBU[2021-08-17T10:26:25.361036645-04:00] docker.io/library/mongo:4.2.3 resolved to a manifestList object with 5 entries; looking for a unknown/amd64 match 

图像名称问题:

REPOSITORY                 TAG       IMAGE ID       CREATED         SIZE
xxx.xxx.x.xxx:8083/mongo   4.2.3     97a9a3e85158   17 months ago   386MB

关于此的任何指导都会有所帮助。

Nexus Docker (xxx.xxx.x.xxx:8083) 指向端口 8083 上的托管类型,mongo:4.2.3 被上传到此 docker 类型。我们最终想在没有互联网连接的气隙系统中使用它。

我猜你正试图将你的 nexus docker 存储库设置为密封网络中机器的默认存储库。

由于 docker 文档中的 following,需要更改:

Tag an image for a private repository

  • To push an image to a private registry and not the central Docker registry you must tag it with the registry hostname and port (if needed).

$ docker 标签 0e5574283393 myregistryhost:5000/fedora/httpd:version1.0

具有更多的前期配置和维护,但不需要对客户端计算机进行任何更改

如果您的网络中有 DNS 服务器,您可以将 docker.io 指向您的 Nexus 主机 IP 地址,并放置一个代理来拦截通信并重定向和调整请求,因为它们是对 Nexus docker 注册表

希望这能解决你的问题:)

更新 1:

可能您还需要像指定的 here 一样更改 /etc/containers/registries.conf 以仅或同时指定您的 nexus docker 注册表。

更新二: 在让 Gopi 完全放弃之前,我建议使用 Podman 作为 Docker 的替代品。 Podman 是一个无守护程序的容器引擎,它通过分叉进程来处理每个 运行 容器。由于我之前提到的 OCI standard, and on top of that, the only change when using it is replacing the docker command prefix with podman since all the commands are exactly the same. Podman was created by RedHat so by default it searches RedHat repos and you can add your own too as shown in this 文章,它可以无缝地处理 docker 图像。

这里发生了三件事:

I am trying to pull docker image from Nexus repo without using the registry mirror in the command line and it is throwing an error. If I use the registry mirror in the pull it is succeeding but the image name is not I would like.

我会建议改变你的喜好。 :)

如果您想从特定注册表中提取,请在映像名称中使用该注册表。尝试使用短名称引用本地注册表会合并两个不同的图像注册表命名空间,这意味着 运行 来自错误命名空间的图像很容易导致安全漏洞。对于 docker 不容易受到影响的其他软件包存储库(请参阅“依赖混淆”攻击)来说,这是一个大问题,因为它们需要注册表名称作为图像名称的一部分(唯一的例外是 Docker Hub ).即使是试图将 add-registryblock-registry 之类的选项添加到上游 docker 引擎(但失败了,这些选项只出现在 RedHat 特定的分支中)的 RedHat 现在也告诉用户 that it was a very bad idea 现在,他们的用户面临无法轻松修复的安全漏洞,因为删除该功能会破坏许多用户环境。


接下来,为什么拉动没有转到您的注册表?因为您的图像名称与 Docker Hub 的图像名称不匹配。没有用户名的官方图片实际上在 library 存储库下。这通常是隐藏的,但你可以做 docker pull library/alpine 甚至 docker pull docker.io/library/alpine 而不是 docker pull alpine 之类的事情,所有 3 个都将从同一个地方拉出来。

修复是 运行

docker pull xxx.xxx.x.xxx:8083/mongo:4.2.3
docker tag xxx.xxx.x.xxx:8083/mongo:4.2.3 xxx.xxx.x.xxx:8083/library/mongo:4.2.3
docker push xxx.xxx.x.xxx:8083/library/mongo:4.2.3

最后一个问题我实际上帮不了你,它来自你从集线器中拉出时看到的错误消息,它应该有效:

docker.io/library/mongo:4.2.3 resolved to a manifestList object with 5 entries; looking for a unknown/amd64 match

unknown/amd64 对我来说是出乎意料的,通常是 linux/amd64,所以您 运行 在其上执行命令的平台有些出乎意料的地方。如果您想调试它,请使用 docker info 更新您的问题。您可以尝试使用以下方法解决此问题:

docker pull --platform linux/amd64 mongo:4.2.3

强制使用平台,但这仍然不能解释为什么它不知道您当前的平台。