为什么"none"映像出现在 Docker 中以及如何避免它



当我运行docker-compose build命令在Docker中重建图像时,因为我在Dockerfile中更改了一些内容,有时我会得到"none"图像标记。我们如何才能避免这个事实?我想重建图像,但none图像不应出现。

REPOSITORY  TAG            IMAGE ID            CREATED             SIZE
magento2    latest         b4dce4dcbd4f        16 hours ago        516MB
<none>      <none>         b4ffce2bf91e        16 hours ago        519MB
<none>      <none>         a1aedb60c82a        17 hours ago        516MB
<none>      <none>         ec9a14ae856c        20 hours ago        519MB
<none>      <none>         ef8eba6874cc        23 hours ago        516MB
<none>      <none>         0e53a8b8c303        23 hours ago        516MB
php         7.1-apache     93e6fb4b13e1        3 weeks ago         369MB
mysql       5.6.39         079344ce5ebd        7 months ago        256MB

以下是Docker<none>:<none>图像的一些部分?

好的<none>:<none>

这些是中间图像,可以使用docker images -a看到。它们不会导致磁盘空间问题,但这绝对是一个屏幕"问题";房地产;问题由于所有这些<none>:<none>图像的含义可能相当混乱。

坏的<none>:<none>

这些映像是悬挂的映像,可能会导致磁盘空间问题。这些<none>:<none>图像被列为docker images的一部分并且需要被修剪。

(Docker中的悬空文件系统层是未使用的,并且没有被任何图像引用。因此,我们需要一种机制让Docker清除这些悬空图像(

因此

  • 如果您的案例与dangling图像有关,可以使用删除它们

    docker rmi $(docker images -f "dangling=true" -q)
    

    还有docker image prune选项,但客户端和守护程序API都必须至少为v1.25才能使用此命令。

  • 如果您的案例与intermediate图像有关,可以保留它们,其他图像则指向它们的引用。

相关文档:

  • docker rmi
  • docker镜像rm
  • docker图像修剪

根据我的经验,大多数<none>图像都由临时容器保存。由于Docker架构,这些容器即使在停止后也会被保留下来。您可以使用验证您有多少停止的容器

docker ps -a

因此,要删除<none>图像,首先需要删除不需要的容器:

docker container prune
docker image prune

以上两个命令可以缩写为

docker system prune

根据@tgogos的说法,除了需要更多的投票外,几乎没有什么可添加的。

您可以在此处检查悬挂和非悬挂图像的图像大小:

docker system df -v

不要被中间图像所困扰。通过这种方式,您可以通过为Dockerfile的每一行保留中间图像来监督构建过程的效率,也就是说,如果没有发生更改,那么在构建过程中可以跳过这一行。

您可以使用移除悬挂的图像

docker rmi $(docker images -f "dangling=true" | grep "<none>.*<none>" | awk '{ print $3; }')

这将删除Windows:中所有悬挂的docker图像

for /f %x in ('docker images -f "dangling=true" -q') do docker rmi %x

要删除<none>层,请使用:

docker rmi $(docker images --filter "dangling=true" -q --no-trunc)

相关内容

最新更新