使用--tag参数的Docker构建命令无法标记镜像

25

我正在尝试使用本地可用的Dockerfile构建Docker镜像。

docker build -t newimage .

我之前多次使用过这个命令,但现在它不起作用了,我被困在找出原因的过程中。

如果有人能帮我找到可能的解决方案或问题可能存在的区域,那将非常有帮助。

我已经查看了其他可能相关的帖子,例如: Docker build tag repository name


你收到了什么错误信息? - Martin
没有错误信息。当我运行 docker images 命令时,没有带有这个标签的镜像,而是有一个被标记为 <none> 的镜像。 - Harshil
那么看起来您已经使用相同的标签构建了一个不同的Dockerfile(或对其进行了更改)。Docker不会删除容器,它只会删除标签,导致出现<none> - Martin
我刚刚检查了一下。我尝试清除/删除所有图像。然后我再次运行了 docker build -t newimage . 命令,现在只有一个图像可用于运行 docker images,并且该图像的标记为 <none> - Harshil
4个回答

26
好的!我找到了问题的原因。
DOCKER构建过程
当我们构建一个Docker镜像时,在创建镜像的过程中会生成几个其他的中间镜像。我们在docker images中看不到它们,因为随着下一个中间镜像的生成,之前的镜像就会被删除。最后,我们只有一个最终的镜像。
我们使用-t或--tag提供的标签是针对最终构建的,显然没有将中间容器标记为相同的标签。
问题解释
当我们尝试使用Dockerfile构建Docker镜像时,有时进程无法成功完成,会显示类似于“成功使用IMAGEID构建镜像”的消息。
所以很明显,构建失败的镜像不会在docker images中列出。
现在,带有标签的镜像是另一个镜像(中间镜像)。这会产生一个混淆,认为镜像存在但没有标签,但实际上这个镜像并不是最终构建应该是什么样子的,因此没有标记。

应该会有一个错误消息,说明构建不成功。你没有看到吗? - Henry
2
没有这样的消息!我在命令中打了一个错字,所以有一个日志显示该命令返回了非零输出,/bin/sh: 1: s: not found The command '/bin/sh -c s' returned a non-zero code: 127之类的东西...但是Docker守护程序没有出现错误消息。 - Harshil
2
我也遇到了同样的问题,使用docker:Docker版本18.09.5,构建e8ff056。这是我的解决方法:docker tag IMAGE_ID MY_TAG。 - Leonidas Menendez

2
如果您的Dockerfile最后一行是RUN,则在构建过程中可能会卡在该行。
我将 RUN npm start 改为 CMD ["npm", "start"],现在正在标记。

1

我想说的是,Docker 没有任何问题。

一个镜像可以有多个标签:

alpine    3.4      4e38e38c8ce0        6 weeks ago         4.799 MB
alpine    latest   4e38e38c8ce0        6 weeks ago         4.799 MB

在这个例子中,ID为4e38e38c8ce0的图像被标记为alpine:latestalpine:3.4。如果您执行docker build -t alpine .,则latest标签将从图像4e38e38c8ce0中删除,并分配给新构建的图像(具有不同的ID)。
如果您从图像中删除最后一个tag,则该图像不会自动删除。它会显示为<none>
Docker还使用缓存。因此,如果您使用Dockerfile构建图像,更改该文件,再次构建图像,然后撤消更改并再次构建,则将拥有两个图像-您在第一步和最后一步构建的图像相同。第二个图像将被“标记”为<none>
如果您想保留图像的多个版本,请使用docker build -ttag:versionimage:tag .,其中versiontag每次进行更改时都会更改。

编辑: 我所说的标签实际上是图像名称,我所说的版本被称为标签:https://docs.docker.com/engine/reference/commandline/tag/


1
你分享的信息很好,但这不是我要找的问题。这与多个具有相同名称的图像无关。无论如何,谢谢。 - Harshil
请分享docker build命令的输出以及docker images - Martin
感谢您的努力。我找到了问题并已发布答案。 - Harshil

0

针对这种情况的一种解决方法是,在构建命令之后立即运行以下命令,如果所有其他图像已经被标记。

docker tag $(docker image ls | grep "<none>" | awk '{print $3}') newimage:latest

据我所知,这只能在Linux操作系统中运行。


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