我试图使用本地可用的 Dockerfile 构建 Docker 映像。
docker build -t newimage .
我之前也多次使用过这个命令,但不知何故它目前不起作用,我一直在寻找它的原因。
如果有人可以帮助我找到可能的解决方案或寻找问题的可能区域,我将非常有帮助。
我已经查看了可能相关的其他帖子,例如: Docker build tag repository name
我试图使用本地可用的 Dockerfile 构建 Docker 映像。
docker build -t newimage .
我之前也多次使用过这个命令,但不知何故它目前不起作用,我一直在寻找它的原因。
如果有人可以帮助我找到可能的解决方案或寻找问题的可能区域,我将非常有帮助。
我已经查看了可能相关的其他帖子,例如: Docker build tag repository name
好的!我找到了问题的原因。
Docker 构建过程
当我们构建一个 docker 镜像时,在创建一个镜像的过程中会生成几个其他的中间镜像。我们从来没有看到它们,docker images
因为随着下一个中间图像的生成,较早的图像被删除了。最后我们只有一个是最终图像。
我们使用-t
or提供的标签--tag
用于最终构建,显然没有中间容器被标记相同。
问题说明
当我们尝试使用 Dockerfile 构建 docker 映像时,有时该过程未成功完成,并显示类似的消息Successfully built image with IMAGEID
所以很明显,失败的构建不会被列出docker images
现在,带有标签的图像<none>
是其他图像(中间)。这会造成图像存在但没有标记的混淆,但图像实际上不是最终构建应该是的,因此没有标记。
如果您的 Dockerfile 的最后一行是 RUN,那么它可能会在构建期间挂起。
我改成现在它正在标记RUN npm start
。CMD ["npm", "start"]
Docker 没有任何问题。
一张图片可以有多个标签:
alpine 3.4 4e38e38c8ce0 6 weeks ago 4.799 MB
alpine latest 4e38e38c8ce0 6 weeks ago 4.799 MB
在此示例中,带有 id 的图像4e38e38c8ce0
被标记为alpine:latest
和alpine:3.4
。如果您要执行docker build -t alpine .
标签latest
,将从图像中删除4e38e38c8ce0
并分配给新构建的图像(具有不同的 id)。
如果您tag
从图像中删除最后一个,则图像不会自动删除。它显示为<none>
。
Docker 也使用缓存。因此,如果您使用 Dockerfile 构建镜像,更改该文件,再次构建镜像,然后撤消更改并再次构建,您将拥有两个镜像 - 您在第一步和最后一步构建的镜像是相同的。第二张图片将被“标记” <none>
。
如果您想保留图像的多个版本,则每次进行一些更改时都会更改位置。docker build -t
tag:version
image:tag .
version
tag
编辑:我所说的标签实际上是图像名称,而我所说的版本被称为标签:https ://docs.docker.com/engine/reference/commandline/tag/
这种情况下的解决方案之一,如果所有其他图像已被标记,则在构建命令后立即运行以下命令。
docker tag $(docker image ls | grep "<none>" | awk '{print $3}') newimage:latest
据我所知,这仅适用于 linux 操作系统。