使用--tag的Docker构建命令无法标记图像

时间:2016-08-05 11:08:46

标签: docker dockerfile docker-build

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

docker build -t newimage .

我之前也多次使用过这个命令,但不知何故它目前无法正常工作,我找不到它的原因。

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

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

4 个答案:

答案 0 :(得分:15)

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

DOCKER BUILD PROCESS

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

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

问题解释

当我们尝试使用Dockerfile构建docker镜像时,有时会使用类似Successfully built image with IMAGEID

之类的消息成功完成该过程

因此很明显,失败的构建将不会列在docker images

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

答案 1 :(得分:1)

如果Dockerfile的最后一行是RUN,那么它可能会在构建过程中挂起。

我将RUN npm start更改为CMD ["npm", "start"],并且现在对其进行了标记。

答案 2 :(得分:0)

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构建图像,更改该文件,再次构建图像​​,然后再撤消更改并再次构建,您将拥有两个图像 - 您在第一步和最后一步中构建的图像是相同的。第二张图片将被标记为#34; <none>

如果您想保留多个版本的图片,请使用docker build -t tag:version image:tag .其中 version {每次进行一些更改时,{1}}都会更改。

修改: 我所谓的标签实际上是图像名称,我称之为版本的标签叫做https://docs.docker.com/engine/reference/commandline/tag/

答案 3 :(得分:0)

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

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

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