Docker堆栈部署出现“无此映像错误”

40

我正在使用Docker Swarm,并希望使用docker-compose部署服务。我的服务使用了一个名为myuser/myrepo:mytag的自定义镜像,我已经成功将其部署到私有仓库的Docker-Hub上。

我的docker-compose文件如下:

version: "3.3"

services:

  myservice:
    image: myuser/myrepo:mytag
    ports:
      - "8080:8080"
在执行任务之前,我成功地使用 docker pull myuser/myrepo:mytag 拉取了镜像。但是,当我运行 docker stack deploy -c docker-compose.yml myapp 时,总是会出现错误:"No such image: myuser/myrepo:mytag"
有趣的是,仅使用 docker-compose up (即不使用集群模式)运行相同的文件时,一切都正常工作,服务也能够启动。
我真的不明白为什么会失败? 我已经尝试使用 docker system prune 清理docker,并重新拉取我的镜像,但没有成功。
7个回答

58

已经找到解决方案。 我的镜像托管在私有仓库中。 除了群集管理器(我执行命令的地方)外,还有一个正在运行的群集工作节点。

当我运行 docker stack deploy -c docker-compose.yml myapp 时,Docker将服务部署到工作节点(而不是我原以为的管理节点)。 在工作节点上,Docker没有凭据来从私有仓库中拉取镜像。 因此,要解决这个问题,可以通过传递标志 --with-registry-auth(它会将存储库的凭证推送到工作节点)或确保服务部署到存在镜像的节点来修复它。

参见:https://docs.docker.com/engine/reference/commandline/deploy/


4
你好,我使用docker stack deploy --prune --with-registry-auth --resolve-image=always --compose-file docker-compose.yml stack_name,我经常会遇到这个错误。它非常随机,有时所有节点都能获取到镜像,有时则无法获取。这已经让我疯狂了一段时间。你有没有什么想法,可能是什么问题呢?我还在使用私有注册表。 - Konrad
@Konrad - 只是想插一句话...我也是!在进行完新的GitHub工作流标记、推送、拉取和部署到Swarm之后,第一次运行失败并显示相同的错误。不知道为什么。 - setcookie

6
我希望能够添加另一种导致相同结果(错误信息)的情况,以便人们不会撞头。
另一个可能性是您试图使用不安全的镜像库部署映像,但忘记在拉取映像的服务器上编辑daemon.json文件。
如果是这种情况,请让此答案作为提醒,并为您节省一些时间。

1

对我来说,问题出在GitLab授权令牌($CI_REGISTRY_USER,$CI_REGISTRY_PASSWORD),这个令牌在部署到主分支时是有效的,但在工作节点上却无效,因为GitLab作业已经结束了。


0

在公司防火墙后面,我在 Mac 上遇到了类似的问题。

只有在直接连接互联网后,我才能解决这个问题。

更新一下,当我使用 VPN 时,我可以在没有任何代理设置的情况下访问互联网,并且可以通过 docker run 正常下载(docker)镜像。问题只出现在 docker-compose 中。

我尝试在我的虚拟机中将 nameserver 更改为 8.8.8.8,但问题并未得到解决。


0

对我来说,我在使用Portainer更新堆栈时,遇到了一个我已部署到新注册表中的镜像的问题。

我在所有节点上配置了所有必要的证书和登录信息,并使用以下命令验证了我已上传镜像:

curl -X GET https://myregistry:5000/v2/_catalog curl -X GET https://myregistry:5000/v2/{image}/tags/list

无论我尝试什么,服务实例始终显示“没有这样的镜像”错误。

在最后一次尝试中,我创建了一个服务(没有使用compose文件),使用与之前完全相同的URL来获取我的镜像,它起作用了,即docker找到了镜像并启动了服务!然后,使用compose文件进行的进一步尝试都可以正常工作,包括所有其他新镜像。

奇怪。


0

另一个可能导致相同错误的问题是,在使用运行在Swarm节点管理器上的私有注册表时。请确保将注册表作为服务运行而不仅仅是作为容器运行!希望这能为您节省时间!


0
另一个需要注意的事情是:群集节点上的磁盘空间。我的磁盘空间已经用完,导致产生了这个不透明的错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接