如何删除旧的和未使用的Docker镜像

长时间运行码头时,系统中有很多图像。 我如何一次删除所有未使用的码头图像以释放存储空间?

另外,我还想删除几个月前拉出的具有正确TAG

所以,我并不是要求只删除未标记的图像。 我正在寻找一种方法来移除一般未使用的图像,其中包括未标记的图像和其他图像,例如几个月前用正确的TAG拉出的图像


2016年9月更新:Docker 1.13:PR 26108和commit 86de7c0引入了一些新命令来帮助可视化Docker守护进程数据在磁盘上占用多少空间,并允许轻松清除“不需要的”过量。

docker system prune将删除所有悬挂的数据(即顺序:容器停止,没有容器的容器和没有容器的图像)。 即使未使用的数据,带有-a选项。

你也有:

  • docker container prune
  • docker image prune
  • docker network prune
  • docker volume prune
  • 对于未使用的图像,请使用docker docker image prune -a (用于删除悬挂和未图像的图像)。
    警告:'未使用'是指“未被任何容器引用的图像”:在使用-a前要小心。


    原文答案(2016年9月)

    我通常会这样做:

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

    我有一个别名来消除这些[摇晃的图像] 8: drmi

    dangling=true过滤器查找未使用的图像

    这样,任何不再被标记图像引用的中间图像都将被删除。

    首先为退出的流程(容器)做同样的事情,

    alias drmae='docker rm $(docker ps -qa --no-trunc --filter "status=exited")'
    

    正如haridsv在评论中指出的那样:

    从技术上讲, 在清理图像之前您应该首先清理容器,因为这会捕捉更多悬挂图像并减少错误


    Jess Frazelle(jfrazelle)具有bashrc功能:

    dcleanup(){
        docker rm -v $(docker ps --filter status=exited -q 2>/dev/null) 2>/dev/null
        docker rmi $(docker images --filter dangling=true -q 2>/dev/null) 2>/dev/null
    }
    

    要删除旧图像,而不是“未引用的悬挂”图像,可以考虑docker-gc


    一个简单的Docker容器和图像垃圾收集脚本。

  • 一小时前退出的容器将被移除。
  • 之后不属于任何剩余容器的图像将被删除。

  • 更新第二个(2017-07-08):

    再次参考VonC,使用更新的system prune 。 不耐烦的人可以用-f, --force选项跳过提示:

    docker system prune -f
    

    不耐烦和鲁莽的人可以用-a, --all选项删除“不使用的图像,而不仅仅是悬挂的图像”:

    docker system prune -af
    

    https://docs.docker.com/engine/reference/commandline/system_prune/

    更新:

    参考使用最近添加的prune命令的VonC答案。 这里是相应的shell别名方便程度:

    alias docker-clean=' 
      docker container prune -f ; 
      docker image prune -f ; 
      docker network prune -f ; 
      docker volume prune -f '
    

    老答案:

    删除已停止(退出)的容器:

    $ docker ps --no-trunc -aqf "status=exited" | xargs docker rm
    

    删除未使用的(悬挂)图像:

    $ docker images --no-trunc -aqf "dangling=true" | xargs docker rmi
    

    如果您对于不可撤销的数据丢失 非常谨慎 ,那么您可以删除未使用(悬空)的卷(v1.9及更高版本):

    $ docker volume ls -qf "dangling=true" | xargs docker volume rm
    

    这里他们在一个方便的shell别名中:

    alias docker-clean=' 
      docker ps --no-trunc -aqf "status=exited" | xargs docker rm ; 
      docker images --no-trunc -aqf "dangling=true" | xargs docker rmi ; 
      docker volume ls -qf "dangling=true" | xargs docker volume rm'
    

    参考文献:

  • docker ps -f
  • docker rm
  • docker images -f
  • docker rmi
  • Docker v1.9.0发行说明
  • docker volume ls
  • docker volume rm

  • 要移除超过一个月的旧标记图像,请执行以下操作:

    $ docker images --no-trunc --format '{{.ID}} {{.CreatedSince}}' 
        | grep ' months' | awk '{ print $1 }' 
        | xargs --no-run-if-empty docker rmi
    

    请注意,它将无法删除容器使用的图像,在存储库中引用,具有相关的子图像......这可能是您想要的。 否则只需添加-f标志。

    /etc/cron.daily/docker-gc脚本示例:

    #!/bin/sh -e
    
    # Delete all stopped containers (including data-only containers).
    docker ps -a -q --no-trunc --filter "status=exited" | xargs --no-run-if-empty docker rm -v
    
    # Delete all tagged images more than a month old
    # (will fail to remove images still used).
    docker images --no-trunc --format '{{.ID}} {{.CreatedSince}}' | grep ' months' | awk '{ print $1 }' | xargs --no-run-if-empty docker rmi || true
    
    # Delete all 'untagged/dangling' (<none>) images
    # Those are used for Docker caching mechanism.
    docker images -q --no-trunc --filter dangling=true | xargs --no-run-if-empty docker rmi
    
    # Delete all dangling volumes.
    docker volume ls -qf dangling=true | xargs --no-run-if-empty docker volume rm
    
    链接地址: http://www.djcxy.com/p/18239.html

    上一篇: How to remove old and unused Docker images

    下一篇: Should I be concerned about excess, non