【问题标题】:Docker build command with --tag unable to tag images带有 --tag 的 Docker 构建命令无法标记图像
【发布时间】:2016-12-11 18:46:39
【问题描述】:

我正在尝试使用本地可用的 Dockerfile 构建 Docker 映像。

docker build -t newimage .

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

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

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

【问题讨论】:

  • 您收到的错误信息是什么?
  • 没有错误信息。当我运行 docker images 时,没有带有此类标记的图像,而是我有一个标记为 <none> 的图像
  • 那么您似乎已经使用相同的标签构建了一个图像,但Dockerfile 不同(或对其进行了更改)。 Docker并没有删除容器,它只是删除了标签,导致<none>。
  • 我刚刚检查过了。我尝试清除/删除所有图像。然后我再次运行docker build -t newimage . 命令,现在运行docker images 时只有一个图像可用,并且标记为<none>

标签: docker dockerfile docker-build


【解决方案1】:

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

DOCKER 构建过程

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

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

问题说明

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

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

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

【讨论】:

  • 应该有一条错误消息说构建不成功。你没看到吗?
  • 不,没有这样的消息!我在命令中写错了,所以有一个日志说命令返回非零输出,/bin/sh: 1: s: not found The command '/bin/sh -c s' returned a non-zero code: 127 类似这样的东西.. 但是 Docker 守护进程没有错误消息。
  • 同样的事情发生在我身上,使用 docker: Docker version 18.09.5, build e8ff056 我是这样解决的:docker tag IMAGE_ID MY_TAG
【解决方案2】:

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

我将RUN npm start 更改为CMD ["npm", "start"],现在它正在标记。

【讨论】:

    【解决方案3】:

    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 -ttag:versionimage:tag . 其中 versiontag 每次制作时都会更改一些变化。

    编辑: 我所说的tag其实就是图片名,我所说的version就是tag:https://docs.docker.com/engine/reference/commandline/tag/

    【讨论】:

    • 您分享的信息非常好,但这不是我想要的。这不是与具有相同名称的多个图像相关的问题。还是谢谢
    • 请分享docker build 命令以及docker images 的输出
    • 感谢您的努力。我发现了问题并发布了答案
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      • 2017-09-15
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多