24

我试图使用本地可用的 Dockerfile 构建 Docker 映像。

docker build -t newimage .

我之前也多次使用过这个命令,但不知何故它目前不起作用,我一直在寻找它的原因。

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

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

4

4 回答 4

24

好的!我找到了问题的原因。

Docker 构建过程

当我们构建一个 docker 镜像时,在创建一个镜像的过程中会生成几个其他的中间镜像。我们从来没有看到它们,docker images因为随着下一个中间图像的生成,较早的图像被删除了。最后我们只有一个是最终图像。

我们使用-tor提供的标签--tag用于最终构建,显然没有中间容器被标记相同。

问题说明

当我们尝试使用 Dockerfile 构建 docker 映像时,有时该过程未成功完成,并显示类似的消息Successfully built image with IMAGEID

所以很明显,失败的构建不会被列出docker images

现在,带有标签的图像<none>是其他图像(中间)。这会造成图像存在但没有标记的混淆,但图像实际上不是最终构建应该是的,因此没有标记。

于 2016-08-06T06:10:02.920 回答
2

如果您的 Dockerfile 的最后一行是 RUN,那么它可能会在构建期间挂起。

我改成现在它正在标记RUN npm startCMD ["npm", "start"]

于 2020-04-27T22:36:12.350 回答
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/

于 2016-08-05T11:22:58.550 回答
0

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

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

据我所知,这仅适用于 linux 操作系统。

于 2018-11-22T16:10:42.430 回答