我尝试使用本地可用的Dockerfile构建Docker镜像。
docker build -t newimage .
我之前也多次使用过这个命令,但不知何故它目前无法正常工作,我找不到它的原因。
如果有人可以帮助我寻找可能的解决方案或可能的区域来寻找问题,我将会非常有帮助。
我已经查看过可能与之相关的其他帖子,例如: Docker build tag repository name
答案 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:latest
和alpine:3.4
。如果您要执行docker build -t alpine .
,latest
标记将从图像4e38e38c8ce0
中删除,并分配给新构建的图像(具有不同的ID)。
如果您从图片中删除了最后一个tag
,则图片不会自动删除。它显示为<none>
。
Docker还使用缓存。因此,如果您使用Dockerfile构建图像,更改该文件,再次构建图像,然后再撤消更改并再次构建,您将拥有两个图像 - 您在第一步和最后一步中构建的图像是相同的。第二张图片将被标记为#34; <none>
。
如果您想保留多个版本的图片,请使用docker build -t
tag:version
image:tag .
其中 {每次进行一些更改时,{1}}都会更改。version
修改强>: 我所谓的标签实际上是图像名称,我称之为版本的标签叫做https://docs.docker.com/engine/reference/commandline/tag/
答案 3 :(得分:0)
针对这种情况的一种解决方案,如果已经标记了所有其他图像,则在构建命令后立即在命令下面运行。
docker tag $(docker image ls | grep "<none>" | awk '{print $3}') newimage:latest
据我所知,这仅适用于linux操作系统。