Docker 使用 --tag 构建命令无法标记图像
Docker build command with --tag unable to tag images
我正在尝试使用本地可用的 Docker 文件构建 Docker 图像。
docker build -t newimage .
我之前也多次使用过这个命令,但不知何故它目前不起作用,我一直在寻找它的原因。
如果有人可以帮助我提供可能的解决方案或可能的领域来寻找问题,我将非常有帮助。
我已经看过其他可能相关的帖子,例如:
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 也使用缓存。因此,如果您使用 Docker 文件构建映像,更改该文件,再次构建映像,而不是撤消更改并再次构建,您将有两个映像 - 您在第一步和最后一步中构建的映像是相同的.第二张图片将是 "tagged" <none>
.
如果您想保留图像的多个版本,请使用 docker build -t
tag:version
image:tag .
其中 version
tag
每次做一些改变都会改变。
编辑:
我所谓的tag其实就是镜像名,我所说的version就是所谓的tag:https://docs.docker.com/engine/reference/commandline/tag/
好的!我找到了问题的原因。
DOCKER 构建过程
当我们构建 docker 图像时,在创建图像的过程中会生成其他几个中间图像。我们从来没有在 docker images
中看到它们,因为随着下一个中间图像的生成,较早的图像最终是 removed.And 我们只有一个是最终图像。
我们使用 -t
或 --tag
提供的标签用于最终构建,显然没有中间容器使用相同的标签。
问题解释
当我们尝试使用 Dockerfile 构建 docker 图像时,有时该过程未成功完成并显示类似 Successfully built image with IMAGEID
的消息
所以很明显失败的构建不会在docker images
中列出
现在,带有标签 <none>
的图像是其他图像(中间)。这造成了图像存在但没有标签的混淆,但图像实际上不是最终构建应该的图像,因此没有标记。
此案例的解决方案之一,运行 如果所有其他图像都已标记,则在生成命令后立即在命令下方。
docker tag $(docker image ls | grep "<none>" | awk '{print }') newimage:latest
据我所知,这仅适用于 linux os。
如果您的 Dockerfile 的最后一行是 运行 那么它可能会在构建期间挂起。
我将 RUN npm start
更改为 CMD ["npm", "start"]
,现在正在标记。
我正在尝试使用本地可用的 Docker 文件构建 Docker 图像。
docker build -t newimage .
我之前也多次使用过这个命令,但不知何故它目前不起作用,我一直在寻找它的原因。
如果有人可以帮助我提供可能的解决方案或可能的领域来寻找问题,我将非常有帮助。
我已经看过其他可能相关的帖子,例如:
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 也使用缓存。因此,如果您使用 Docker 文件构建映像,更改该文件,再次构建映像,而不是撤消更改并再次构建,您将有两个映像 - 您在第一步和最后一步中构建的映像是相同的.第二张图片将是 "tagged" <none>
.
如果您想保留图像的多个版本,请使用 docker build -t
tag:version
image:tag .
其中 version
tag
每次做一些改变都会改变。
编辑: 我所谓的tag其实就是镜像名,我所说的version就是所谓的tag:https://docs.docker.com/engine/reference/commandline/tag/
好的!我找到了问题的原因。
DOCKER 构建过程
当我们构建 docker 图像时,在创建图像的过程中会生成其他几个中间图像。我们从来没有在 docker images
中看到它们,因为随着下一个中间图像的生成,较早的图像最终是 removed.And 我们只有一个是最终图像。
我们使用 -t
或 --tag
提供的标签用于最终构建,显然没有中间容器使用相同的标签。
问题解释
当我们尝试使用 Dockerfile 构建 docker 图像时,有时该过程未成功完成并显示类似 Successfully built image with IMAGEID
所以很明显失败的构建不会在docker images
现在,带有标签 <none>
的图像是其他图像(中间)。这造成了图像存在但没有标签的混淆,但图像实际上不是最终构建应该的图像,因此没有标记。
此案例的解决方案之一,运行 如果所有其他图像都已标记,则在生成命令后立即在命令下方。
docker tag $(docker image ls | grep "<none>" | awk '{print }') newimage:latest
据我所知,这仅适用于 linux os。
如果您的 Dockerfile 的最后一行是 运行 那么它可能会在构建期间挂起。
我将 RUN npm start
更改为 CMD ["npm", "start"]
,现在正在标记。