这个问题与我是否应该关注过量的、未运行的Docker容器有关。
我想知道如何移除旧容器。docker rm 3e552code34a允许你删除一个,但我已经有很多了。Docker rm——help没有提供选择选项(像all一样,或者通过映像名称)。
也许有一个存放这些容器的目录,我可以很容易地手动删除它们?
这个问题与我是否应该关注过量的、未运行的Docker容器有关。
我想知道如何移除旧容器。docker rm 3e552code34a允许你删除一个,但我已经有很多了。Docker rm——help没有提供选择选项(像all一样,或者通过映像名称)。
也许有一个存放这些容器的目录,我可以很容易地手动删除它们?
当前回答
新方法: Spotify /docker-gc发挥了作用。
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc
超过一小时前离开的集装箱被移除。 删除之后不属于任何剩余容器的图像
它支持环境设置
强制删除具有多个标记的图像
FORCE_IMAGE_REMOVAL=1
强制删除容器
FORCE_CONTAINER_REMOVAL=1
从垃圾收集中排除最近退出的容器和图像
GRACE_PERIOD_SECONDS=86400
此设置还可以防止删除小于GRACE_PERIOD_SECONDS秒前创建的映像。
排练
DRY_RUN=1
清理孤立的容器卷 CLEAN_UP_VOLUMES = 1
参考:docker-gc
老办法:
删除旧的、未运行的容器
docker ps -a -q -f status=exited | xargs --no-run-if-empty docker rm
OR
docker rm $(docker ps -a -q)
删除与未运行的docker容器关联的所有映像
docker images -q | xargs --no-run-if-empty docker rmi
为docker 1.10版本清理孤立的docker卷。X及以上
docker volume ls -qf dangling=true | xargs -r docker volume rm
基于时间段
docker ps -a | grep "weeks ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
docker ps -a | grep "days ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
docker ps -a | grep "hours ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
其他回答
#!/bin/bash
# docker-gc --- Remove stopped docker containers
RUNNING=$(docker ps -q)
ALL=$(docker ps -a -q)
for container in $ALL ; do
[[ "$RUNNING" =~ "$container" ]] && continue
echo Removing container: $(docker rm $container)
done
下面是一个脚本,用于删除创建时间超过2天的正在运行和已退出的容器:
#!/bin/bash
# This script will kill and remove containers older than 2 days.
#
docker ps -aq > /scripts/containers.txt
today=`date +%Y-%m-%d`
oldate=`date --date="2 day ago" +%Y-%m-%d`
while read p; do
cont=`docker inspect -f '{{ .Created }}' $p | cut -c 1-10`
echo " Created date of $p is $cont"
k=`echo $(( ( $(date -ud $today +'%s') - $(date -ud $cont +'%s'))/60/60/24 ))`
echo $k
if [ $k -ge 2 ];
then
echo "Killing docker container $p"
docker kill $p
echo "Removing docker container $p"
docker rm $p
else
echo "Docker container $p is not one day old, so keeping the container."
fi
done </scripts/containers.txt
删除所有停止的docker容器,执行命令:-
$ docker container prune
你必须小心使用这个命令,因为它会不加区别地删除所有停止的容器,所以要确保没有停止/当前未使用的容器仍然可以使用。
更精确的替代方法是按ID删除容器。您必须首先使用以下命令列出已停止的容器:-
docker ps --filter "status=exited"
然后复制要删除的容器的ID。 然后,执行以下命令,删除一个容器,
docker container rm <container ID>
或下面的一个删除多个容器一次运行:-
docker container rm <container ID 1> <container ID 2> <container ID n>
删除所有docker: docker system prune -a
您可以使用多种方式删除容器,我将在后面的回答中解释它们。
码头集装箱修剪。该命令删除所有现在不工作的容器。您可以通过比较docker ps和docker ps -a的输出来找出哪些容器没有工作。docker ps -a中列出的但docker ps中不存在的容器现在没有工作,但它们的容器没有被删除。 Docker kill $(Docker ps -aq)。这个命令的作用是,通过执行$(docker ps -aq),它返回所有容器的id列表并杀死它们。有时此命令不起作用,因为正在运行的容器正在使用它。要做到这一点,你可以使用——force选项。 Docker rm $(Docker ps -aq)。它与第二个命令的定义相同。它们之间唯一的区别是它会删除容器(和docker prune一样),而docker kill不会。 有时需要删除映像,因为您更改了Dockerfile的配置,需要删除它来重新构建。为此,你可以通过运行docker images来查看所有的图像,然后复制你想要删除的图像的ID。只需执行docker image rm <image-id>即可删除。
PS:你可以用docker PS -a -q代替docker PS -aq,两者没有区别。因为在基于unix的操作系统中,您可以像上面的例子一样加入选项。