社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

本地Docker注册表卷被本地映像100%使用,如何从中释放空间?

Abhishek Yadav • 5 年前 • 2588 次点击  

此外,我还想删除几个月前提取的图像,其中有正确的 TAG .

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/53526
 
2588 次点击  
文章 [ 24 ]  |  最新文章 5 年前
Le Khiem
Reply   •   1 楼
Le Khiem    6 年前

docker images 查看图像列表并将图像哈希ID复制到剪贴板。

跑步 docker rmi -f <Image>

-f 正在强制删除。

Alexey Melezhik
Reply   •   2 楼
Alexey Melezhik    6 年前

有麻雀插件 docker-remove-dangling-images

$ sparrow plg run docker-remove-dangling-images

它适用于Linux和Windows操作系统。

Peter Mortensen Innocent Anigb
Reply   •   3 楼
Peter Mortensen Innocent Anigb    6 年前

如果希望自动/定期清理已退出的容器并删除未运行的容器所使用的图像和卷,则可以下载图像。 meltwater/docker-cleanup .

docker run -d -v /var/run/docker.sock:/var/run/docker.sock:rw  -v /var/lib/docker:/var/lib/docker:rw --restart=unless-stopped meltwater/docker-cleanup:latest

默认情况下,它每30分钟运行一次。但是,您可以使用此标志以秒为单位设置延迟时间(delay_time=1800选项)。

更多细节: https://github.com/meltwater/docker-cleanup/blob/master/README.md

briemers
Reply   •   4 楼
briemers    8 年前

偶尔,我会遇到DOKER分配和继续使用磁盘空间的问题,即使空间没有分配给任何特定的图像或现有的容器。我偶然产生这个问题的最新方法是在RHEL7.1中使用“docker engine”centos build而不是“docker”。似乎有时容器清理没有成功完成,然后空间就永远不会被重用。当我分配的80GB驱动器被/var/lib/docker文件填满时,我不得不想出一个创造性的方法来解决这个问题。

这是我想到的。首先要解决磁盘已满错误:

  1. 停止docker:systemctl停止docker
  2. 将/var/lib/docker中的所有文件移到/mnt/docker。我使用命令:rsync-aPHSx--remove source files/var/lib/docker//mnt/docker/
  3. 将新驱动器装载到/var/lib/docker。

在这一点上,我不再有一个磁盘已满的错误,但我仍然在浪费大量的空间。下一步就是解决这个问题。

  1. 保存所有图像: docker节省$(docker图像| s e d-e'/^/d'-e'/^存储库/d'-e's,[[] ,:,'-e's,[]。

  2. 卸载docker。

  3. 删除/var/lib/docker中的所有内容:

  4. 重新安装docker

  5. 启用docker:systemctl启用docker

  6. 还原图像: docker load</根/docker.img

  7. 启动任何需要运行的持久化容器。

我不推荐每天使用这个。但当docker由于软件错误或意外重新启动而丢失已用磁盘空间的记录时,运行它是很有用的。

mainframer
Reply   •   5 楼
mainframer    9 年前
docker rm `docker ps -aq`

docker rm $(docker ps -q -f status=exited)
Hamit YILDIRIM
Reply   •   6 楼
Hamit YILDIRIM    6 年前
docker rm $(docker ps -faq)
docker rmi $(docker ps -faq)

-f力

-全部

Peter Mortensen Innocent Anigb
Reply   •   7 楼
Peter Mortensen Innocent Anigb    6 年前

@VonC已经给出了一个非常好的答案,但为了完整起见,这里有一个我一直在使用的小脚本,它也会攻击任何出错的Docker进程,如果你有:

#!/bin/bash

imgs=$(docker images | awk '/<none>/ { print $3 }')
if [ "${imgs}" != "" ]; then
   echo docker rmi ${imgs}
   docker rmi ${imgs}
else
   echo "No images to remove"
fi

procs=$(docker ps -a -q --no-trunc)
if [ "${procs}" != "" ]; then
   echo docker rm ${procs}
   docker rm ${procs}
else
   echo "No processes to purge"
fi
gaoithe
Reply   •   8 楼
gaoithe    8 年前

如何删除标记的图像

  1. docker rmi首先标记

  2. #这可以在一个docker rmi调用中完成,例如:# docker rmi<repo:tag><imageid>

(此项工作于2016年11月,Docker版本1.12.2)

$ docker images 
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
usrxx/the-application   16112805            011fd5bf45a2        12 hours ago        5.753 GB
usryy/the-application   vx.xx.xx            5af809583b9c        3 days ago          5.743 GB
usrzz/the-application   vx.xx.xx            eef00ce9b81f        10 days ago         5.747 GB
usrAA/the-application   vx.xx.xx            422ba91c71bb        3 weeks ago         5.722 GB
usrBB/the-application   v1.00.18            a877aec95006        3 months ago        5.589 GB

$ docker rmi usrxx/the-application:16112805 && docker rmi 011fd5bf45a2
$ docker rmi usryy/the-application:vx.xx.xx && docker rmi 5af809583b9c
$ docker rmi usrzz/the-application:vx.xx.xx eef00ce9b81f
$ docker rmi usrAA/the-application:vx.xx.xx 422ba91c71bb
$ docker rmi usrBB/the-application:v1.00.18 a877aec95006

e、 脚本删除任何超过2周。

IMAGESINFO=$(docker images --no-trunc --format '{{.ID}} {{.Repository}} {{.Tag}} {{.CreatedSince}}' |grep -E " (weeks|months|years)")
TAGS=$(echo "$IMAGESINFO" | awk '{ print $2 ":" $3 }' )
IDS=$(echo "$IMAGESINFO" | awk '{ print $1 }' )
echo remove old images TAGS=$TAGS IDS=$IDS
for t in $TAGS; do docker rmi $t; done
for i in $IDS; do docker rmi $i; done
Antony.H
Reply   •   9 楼
Antony.H    8 年前

docker rm $(docker ps -a | grep "weeks" | awk '{ print $1; }')

删除几周前的旧图像。小心。这将删除几周前创建的基础图像,但您的新图像可能正在使用。

docker rmi $(docker images | grep 'weeks' | awk '{ print $3; }')

ospider
Reply   •   10 楼
ospider    8 年前

要删除未运行容器的标记图像,必须使用一个小脚本:

#!/bin/bash

# remove not running containers
docker rm $(docker ps -f "status=exited" -q)

declare -A used_images

# collect images which has running container
for image in $(docker ps | awk 'NR>1 {print $2;}'); do
    id=$(docker inspect --format="{{.Id}}" $image);
    used_images[$id]=$image;
done

# loop over images, delete those without a container
for id in $(docker images --no-trunc -q); do
    if [ -z ${used_images[$id]} ]; then
        echo "images is NOT in use: $id"
        docker rmi $id
    else
        echo "images is in use:     ${used_images[$id]}"
    fi
done
Zaytsev Dmitry
Reply   •   11 楼
Zaytsev Dmitry    6 年前

同时修剪所有图像和卷
docker system prune -af --volumes

Vojtech Vitek
Reply   •   12 楼
Vojtech Vitek    8 年前

docker system prune -a

(将要求您确认命令。使用 -f 如果你知道自己在做什么,就强行逃跑。)

Peter Mortensen Innocent Anigb
Reply   •   13 楼
Peter Mortensen Innocent Anigb    6 年前

如果要删除已拉取的图像 几个月前,您可以尝试以下示例删除三个月前创建的图像:

three_months_old_images=`docker images | grep -vi "<none>" | tr -s ' ' | cut -d" " -f3,4,5,6 | grep "3 months ago" | cut -d" " -f1`
docker rmi $three_months_old_images
illagrenan ShreePrakash
Reply   •   14 楼
illagrenan ShreePrakash    5 年前

$ docker image prune --all --filter until=48h
Peter Mortensen Innocent Anigb
Reply   •   15 楼
Peter Mortensen Innocent Anigb    6 年前

我使用这个命令:

export BEFORE_DATETIME=$(date --date='10 weeks ago' +"%Y-%m-%dT%H:%M:%S.%NZ")
docker images -q | while read IMAGE_ID; do
    export IMAGE_CTIME=$(docker inspect --format='{{.Created}}' --type=image ${IMAGE_ID})
    if [[ "${BEFORE_DATETIME}" > "${IMAGE_CTIME}" ]]; then
        echo "Removing ${IMAGE_ID}, ${BEFORE_DATETIME} is earlier then ${IMAGE_CTIME}"
        docker rmi -f ${IMAGE_ID};
    fi;
done

这将删除创建时间超过10周的所有图像。

Peter Mortensen Innocent Anigb
Reply   •   16 楼
Peter Mortensen Innocent Anigb    6 年前

#!/bin/bash -x
## Removing stopped container
docker ps -a | grep Exited | awk '{print $1}' | xargs docker rm

## If you do not want to remove all container you can have filter for days and weeks old like below
#docker ps -a | grep Exited | grep "days ago" | awk '{print $1}' | xargs docker rm
#docker ps -a | grep Exited | grep "weeks ago" | awk '{print $1}' | xargs docker rm

## Removing Dangling images
## There are the layers images which are being created during building a Docker image. This is a great way to recover the spaces used by old and unused layers.

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

## Removing images of perticular pattern For example
## Here I am removing images which has a SNAPSHOT with it.

docker rmi $(docker images | grep SNAPSHOT | awk '{print $3}')

## Removing weeks old images

docker images | grep "weeks ago" | awk '{print $3}' | xargs docker rmi

## Similarly you can remove days, months old images too.

原稿

https://github.com/vishalvsh1/docker-image-cleanup

/变量/库/docker

此路径是系统的本地路径,通常位于根分区, .

您可以装载更大的磁盘空间并移动 /var/lib/docker

这样,即使Docker映像占用空间,也不会影响您的系统,因为它将使用其他一些装载位置。

Manage Docker images on local disk

Ell Neal
Reply   •   17 楼
Ell Neal    9 年前

我最近在一台服务器上编写了一个脚本来解决这个问题:

#!/bin/bash

# Remove all the dangling images
DANGLING_IMAGES=$(docker images -qf "dangling=true")
if [[ -n $DANGLING_IMAGES ]]; then
    docker rmi "$DANGLING_IMAGES"
fi

# Get all the images currently in use
USED_IMAGES=($( \
    docker ps -a --format '{{.Image}}' | \
    sort -u | \
    uniq | \
    awk -F ':' '$2{print $1":"$2}!$2{print $1":latest"}' \
))

# Get all the images currently available
ALL_IMAGES=($( \
    docker images --format '{{.Repository}}:{{.Tag}}' | \
    sort -u \
))

# Remove the unused images
for i in "${ALL_IMAGES[@]}"; do
    UNUSED=true
    for j in "${USED_IMAGES[@]}"; do
        if [[ "$i" == "$j" ]]; then
            UNUSED=false
        fi
    done
    if [[ "$UNUSED" == true ]]; then
        docker rmi "$i"
    fi
done
Peter Mortensen Innocent Anigb
Reply   •   18 楼
Peter Mortensen Innocent Anigb    6 年前

到目前为止(Dockerversion1.12),我们使用以下命令删除所有正在运行的容器。另外,如果要删除卷,可以在下面的命令中使用其各自的tag-v手动执行此操作。

docker rm $(docker ps -q -f status=exited)

删除所有停止的容器

docker rm $(docker ps -a -q)

删除所有正在运行和已停止的容器

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

docker container rm $(docker container ps -aq)

但是,在1.13及以上版本中,对于完整的系统和清理,我们可以直接使用以下命令:

docker system prune

所有未使用的容器、图像、网络和卷都将被删除。我们还可以使用以下命令来清除各个组件:

docker container prune
docker image prune
docker network prune
docker volume prune
Mahmoud Zalt
Reply   •   19 楼
Mahmoud Zalt    9 年前

这对我有效:

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
Peter Mortensen Innocent Anigb
Reply   •   20 楼
Peter Mortensen Innocent Anigb    6 年前

假设你有 Docker 1.13

# Remove unused images
docker image prune

# Remove stopped containers.
docker container prune

# Remove unused volumes
docker volume prune

# Remove unused networks
docker network prune

# Command to run all prunes:
docker system prune

我建议 docker system prune 命令。我认为用户会意外地删除他们不想删除的东西。就我个人而言,我将主要使用 docker image prune docker container prune 命令。