Py学习  »  docker

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

Abhishek Yadav • 4 年前 • 1601 次点击  

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

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

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

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

跑步 docker rmi -f <Image>

-f 正在强制删除。

Alexey Melezhik
Reply   •   2 楼
Alexey Melezhik    5 年前

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

$ sparrow plg run docker-remove-dangling-images

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

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

如果希望自动/定期清理已退出的容器并删除未运行的容器所使用的图像和卷,则可以下载图像。 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    7 年前

偶尔,我会遇到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    8 年前
docker rm `docker ps -aq`

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

-f力

-全部

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

@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    7 年前

如何删除标记的图像

  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    7 年前

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

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

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

ospider
Reply   •   10 楼
ospider    7 年前

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

#!/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    5 年前

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

Vojtech Vitek
Reply   •   12 楼
Vojtech Vitek    6 年前

docker system prune -a

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

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

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

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    4 年前

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

我使用这个命令:

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    5 年前

#!/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    7 年前

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

#!/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    5 年前

到目前为止(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    7 年前

这对我有效:

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

假设你有 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 命令。