此问题与 Should I be concerned about excess, non-running, Docker containers? 有关。
我想知道如何删除旧容器。 docker rm 3e552code34a
允许您删除一个,但我已经有很多了。 docker rm --help
不提供选择选项(如全部或按图像名称)。
也许有一个存储这些容器的目录,我可以轻松地手动删除它们?
docker run
与 --rm
标志一起使用,这会使容器短暂,在运行后删除所有容器文件。
docker system prune
命令。请参阅my answer below。
Portainer
我们可以使用此工具进行管理all the old containers, non using volumes and images
它是一个简单的 docker 管理 UI Please refer my update below on how to deploy the application
从 Docker 1.13.x 开始,您可以使用 Docker container prune:
docker container prune
这将删除所有停止的容器,并且应该以相同的方式在所有平台上工作。
还有一个 Docker system prune:
docker system prune
这将在一个命令中清理所有未使用的容器、网络、图像(悬空和未引用)以及可选的卷。
对于较旧的 Docker 版本,您可以将 Docker 命令与其他 Unix 命令串在一起以获得您需要的内容。以下是有关如何清理已使用数周的旧容器的示例:
$ docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm
值得称赞的是,该示例来自 https://twitter.com/jpetazzo/status/347431091415703552。
我从 Guillaume J. Charmes 那里得到的另一种方法(应得的信用):
docker rm `docker ps --no-trunc -aq`
将以优雅的方式删除所有容器。
Bartosz Bilicki 为 Windows 提供:
FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i
对于 PowerShell:
docker rm @(docker ps -aq)
Docker 1.13(2016 年第四季度)的更新,归功于 VonC (later in this thread):
docker system prune
将删除所有未使用的数据(即,依次为:容器停止、没有容器的卷和没有容器的图像)。
请参阅 PR 26108 和 commit 86de7c0,它们引入了一些新命令,以帮助可视化 Docker 守护程序数据在磁盘上占用了多少空间,并允许轻松清理“不需要”的多余空间。
docker system prune
WARNING! This will remove:
- all stopped containers
- all volumes not used by at least one container
- all images without at least one container associated to them
Are you sure you want to continue? [y/N] y
docker ps -a -q | xargs docker rm
有效,(可能需要 sudo)
docker rm $(docker ps -a -q)
呢?
--no-trunc
有什么意义,因为 docker rm
无论如何都不需要完整的 ID。
更新答案现在使用 docker system prune
或 docker container prune
。请参阅VonC's updated answer。
上一个答案组合上面的几个不同的提示,删除所有非运行容器的最优雅的方法似乎是:
docker rm $(docker ps -q -f status=exited)
-q 仅打印容器 ID(没有列标题)
-f 允许您过滤打印的容器列表(在这种情况下,我们正在过滤以仅显示退出的容器)
-v
以避免悬空卷:docker rm -v $(docker ps -q -f status=exited)
。有关悬空卷的详细信息,请参阅 docs.docker.com/userguide/dockervolumes/…。
alias docker-gc="docker rm -v \$(docker ps -q -f status=exited)"
docker rm `docker ps -aq`
Docker 维护人员表示不会有此命令 - 您可以这样编写命令:
我们之前已经讨论过这一点,并且希望用户使用上面的行,而不必向 Docker 添加额外的代码。
docker volume
子命令和命名卷的可用性,这些容器不再需要。
使用 Docker 1.13(2016 年第四季度),您现在拥有:
docker system prune -a
将删除所有未使用的数据(即按顺序:容器停止、没有容器的卷和没有容器的图像)。
没有 -a 的 docker system prune
将仅删除(对于图像)悬空图像或没有标签的图像,如 smilebomb 的 commented。
请参阅 PR 26108 和 commit 86de7c0,它们引入了一些新命令,以帮助可视化 Docker 守护程序数据在磁盘上占用了多少空间,并允许轻松清理“不需要”的多余空间。
docker system prune -a
WARNING! This will remove:
- all stopped containers
- all volumes not used by at least one container
- all images without at least one container associated to them
Are you sure you want to continue? [y/N] y
正如 wjv 评论,
还有 docker {container,image,volume,network} prune,可用于删除仅一种类型对象的未使用实例。
在 commit 913e5cb 中引入,仅适用于 Docker 1.13+。
docker container prune
-f
标志以强制清理而不询问任何问题。
docker system prune -a
的,它会删除未使用的图像。 docker system prune
仅删除 dangling 图像或没有标记的图像。
2021 年更新(最新)
docker container prune
这 - 2017(旧)方式
删除所有停止的容器
docker rm $(docker ps -a -q)
删除所有容器(已停止和未停止)
docker rm -f $(docker ps -a -q)
docker volume/container/image prune
,请参阅 stackoverflow.com/a/39860665/3625317
现在可以将 filtering 与 docker ps
一起使用:
docker rm $(docker ps -q -f status=exited)
对于 images:
docker rmi $(docker images -q -f "dangling=true")
但是,当没有匹配的容器时,其中任何一个都会导致 docker rm
或 docker rmi
抛出错误。旧的 docker rm $(docker ps -aq)
技巧更糟糕,因为它试图删除任何正在运行的容器,但每个容器都失败了。
这是一个更简洁的脚本,可添加到您的 ~/.bashrc
或 ~/.profile
中:
# Use `docker-cleanup --dry-run` to see what would be deleted.
function docker-cleanup {
EXITED=$(docker ps -q -f status=exited)
DANGLING=$(docker images -q -f "dangling=true")
if [ "$1" == "--dry-run" ]; then
echo "==> Would stop containers:"
echo $EXITED
echo "==> And images:"
echo $DANGLING
else
if [ -n "$EXITED" ]; then
docker rm $EXITED
else
echo "No containers to remove."
fi
if [ -n "$DANGLING" ]; then
docker rmi $DANGLING
else
echo "No images to remove."
fi
fi
}
编辑:如下所述,最初的答案是删除图像,而不是容器。更新以回答这两个问题,包括文档的新链接。感谢 Adrian(和 Ryan 的回答)提到新的 ps
过滤。
storage
容器。
status=created
来获取未运行且从未运行过的那些。
删除所有停止的容器:
docker rm $(docker ps -a | grep Exited | awk '{print $1}')
来自 pauk960 的评论:
从 1.3.0 版开始,您可以使用带有 docker ps 的过滤器,而不是 grep Exited 使用 docker ps -a -f status=exited。如果你使用 -q ,你只能得到容器 ID 而不是完整的输出,不需要使用 awk 。
如果您不想删除所有容器,可以使用 docker ps -f before=<container-ID>
或 docker ps -f since=<container-ID>
选择在特定容器之前或之后创建的所有容器
假设你已经开发了你的系统,现在它可以工作了,但是还剩下一些容器。您想删除在该工作版本之前创建的容器。使用 docker ps
确定工作容器的 ID。
删除在其他容器之前创建的容器
docker rm $(docker ps -f before=9c49c11c8d21 -q)
另一个例子。您的数据库已经在 Docker 容器上运行。您已经开发了在另一个容器上运行的应用程序,现在您有许多不需要的容器。
删除在某个容器之后创建的容器
docker rm $(docker ps -f since=a6ca4661ec7f -q)
Docker 将容器存储在 Ubuntu 的 /var/lib/docker/containers
中。我认为额外的容器没有其他危害,但会占用磁盘空间。
更新:从 Docker 版本 1.13(2017 年 1 月发布)开始,您可以发出以下命令来清理停止的容器、未使用的卷、悬空图像和未使用的网络:
docker system prune
如果您想确保只删除具有 exited
状态的容器,请使用以下命令:
docker ps -aq -f status=exited | xargs docker rm
同样,如果您正在清理 docker 的东西,您可以通过以下方式摆脱未标记、未命名的图像:
docker images -q --no-trunc -f dangling=true | xargs docker rmi
这是我的 docker-cleanup
脚本,它删除未标记的容器和图像。请检查源以获取任何更新。
#!/bin/sh
# Cleanup docker files: untagged containers and images.
#
# Use `docker-cleanup -n` for a dry run to see what would be deleted.
untagged_containers() {
# Print containers using untagged images: $1 is used with awk's print: 0=line, 1=column 1.
docker ps -a | awk '$2 ~ "[0-9a-f]{12}" {print $'$1'}'
}
untagged_images() {
# Print untagged images: $1 is used with awk's print: 0=line, 3=column 3.
# NOTE: intermediate images (via -a) seem to only cause
# "Error: Conflict, foobarid wasn't deleted" messages.
# Might be useful sometimes when Docker messed things up?!
# docker images -a | awk '$1 == "<none>" {print $'$1'}'
docker images | tail -n +2 | awk '$1 == "<none>" {print $'$1'}'
}
# Dry-run.
if [ "$1" = "-n" ]; then
echo "=== Containers with uncommitted images: ==="
untagged_containers 0
echo
echo "=== Uncommitted images: ==="
untagged_images 0
exit
fi
# Remove containers with untagged images.
echo "Removing containers:" >&2
untagged_containers 1 | xargs --no-run-if-empty docker rm --volumes=true
# Remove untagged images
echo "Removing images:" >&2
untagged_images 3 | xargs --no-run-if-empty docker rmi
来源:https://github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanup
xargs --no-run-if-empty
选项,无法在 OSX 上运行
首先,在尝试移除容器之前停止运行容器
删除正在运行的容器
docker rm $(docker stop -t=1 $(docker ps -q))
您可以使用 kill
而不是 stop
。就我而言,我更喜欢 stop
,因为我倾向于重新运行它们而不是每次都创建一个新的,所以我尝试很好地关闭它们。
注意:尝试停止容器会报错:
错误:无法移除正在运行的容器,请先停止它
移除所有容器
docker rm $(docker ps -a -q)
从 Windows shell 中删除所有容器:
FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i
https://github.com/HardySimpson/docker-cleanup
码头工人清理
一个小巧的一体式外壳,可移除:
超过一天前未运行的容器
不属于任何剩余容器的图像
打算作为 crontab 作业运行
特征
它将删除所有
如果图像有多个 repo:tag 引用,它将删除所有 repo:tag ,除非运行容器。实际上它是“docker rmi”的一种性质。
许多错误信息将显示在屏幕上,您可以决定是否 2>/dev/null
从 docker-gc 学习一些东西,并解决它的问题(它不能删除具有多个 repo:tag 的图像)
因此,我个人建议将此作为映像和容器的部署脚本的一部分,只保留最近的 n 个容器和映像。我使用与 git tag
相同的版本控制架构标记我的 Docker 映像,并且始终使用“最新”标记最新的 Docker 映像。这意味着在不清理任何东西的情况下,我的 Docker 图像最终看起来像:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
some_repo/some_image 0.0.5 8f1a7c7ba93c 23 hours ago 925.4 MB
some_repo/some_image latest 8f1a7c7ba93c 23 hours ago 925.4 MB
some_repo/some_image 0.0.4 0beabfa514ea 45 hours ago 925.4 MB
some_repo/some_image 0.0.3 54302cd10bf2 6 days ago 978.5 MB
some_repo/some_image 0.0.2 0078b30f3d9a 7 days ago 978.5 MB
some_repo/some_image 0.0.1 sdfgdf0f3d9a 8 days ago 938.5 MB
现在,我当然不想让我所有的图像(或容器)在我所有的生产盒上都永久保存。我只想要最后 3 或 4 个用于回滚并摆脱其他所有内容。 Unix 的 tail
是您最好的朋友。由于 docker images
和 docker ps
都按日期排序,我们可以只使用 tail
来选择除前三个之外的所有内容并将它们删除:
docker rmi $(docker images -q | tail -n +4)
将其与您的部署脚本(或本地)一起运行,以始终保留足够的图像以轻松回滚,而不会占用太多空间或将旧图像弄乱。
就个人而言,我在任何时候都只在我的生产箱上保留一个容器,但如果你想要更多,你可以对容器做同样的事情:
docker rm $(docker ps -aq | tail -n +4)
最后,在我的简化示例中,我们一次只处理一个存储库,但如果您有更多,您可以使用相同的想法变得更复杂一些。假设我只想保留 some_repo/some_image 中的最后三张图片。我可以混合使用 grep
和 awk
并继续前进:
docker rmi $(docker images -a | grep 'some_repo/some_image' | awk '{print $3}' | tail -n +4)
同样,同样的想法也适用于容器,但你现在已经明白了,所以我将不再举例。
利用:
docker rm -f $(docker ps -a -q)
它强制停止并删除本地存在的所有容器。
sudo docker rm -f $(sudo docker ps -a -q)
。
sudo
在任何地方都是必需的,除非您将用户添加到“docker”组。我通过将我的用户添加到 docker 组来使用没有 sudo 的 ubuntu 16.10。
删除 5 个最旧的容器:
docker rm `docker ps -aq | tail -n 5`
查看还剩多少个容器:
docker ps -aq | wc -l
移除所有停止的容器。
sudo docker rm $(sudo docker ps -a -q)
这将通过使用 docker ps -a -q 获取所有容器的列表并将它们的 id 传递给 docker rm 来删除所有停止的容器。这不应该删除任何正在运行的容器,它会告诉你它不能删除正在运行的图像。
删除所有未标记的图像
现在您要清理旧图像以节省一些空间。
sudo docker rmi $(sudo docker images -q --filter "dangling=true")
docker ps -aq | xargs docker rm -v
docker rm -f $(docker ps -a -q)
适用于 Windows 的 PowerShell / Docker。
新方法: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.x 及更高版本的孤立 docker 卷
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
删除所有 docker 进程: docker rm $(docker ps -a -q) 删除特定容器: $ docker ps -a (列出所有旧容器) $ docker rm container-Id
您可以使用以下命令删除已退出的容器:
docker rm $(sudo docker ps -a | grep Exit | cut -d ' ' -f 1)
以下是删除 docker 上旧图像的完整要点:Gist to remove old Docker containers and images。
#!/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
您只能删除已停止的容器。一开始就停止所有这些
docker stop $(docker ps -a -q)
然后你可以删除
docker rm $(docker ps -a -q)
我总是使用 docker rmi $(docker ps -a -q)
删除所有图像。
当 docker rmi
失败时,您可以删除目录 /var/lib/docker/graph
。
停止/删除所有容器和图像的基本步骤
列出所有容器 docker ps -aq 停止所有正在运行的容器 docker stop $(docker ps -aq) 删除所有容器 docker rm $(docker ps -aq) 删除所有图像 docker rmi $(docker images -q)
注意:首先,您必须先停止所有正在运行的容器,然后才能删除它们。同样在删除图像之前,您必须停止并删除其依赖容器。
我正在使用以下命令删除 Exited 和 Restarting docker 容器
docker stop --force $(docker ps -a|grep Exited| awk '{print $1}')
docker rm --force $(docker ps -a|grep Exited| awk '{print $1}')
docker stop --force $(docker ps -a|grep Restarting| awk '{print $1}')
docker rm --force $(docker ps -a|grep Restarting| awk '{print $1}')
使用以下命令删除名为 none 的图像
docker image rm --force $(docker image ls |grep none |awk '{print $3}')
试试这个命令来清理容器和悬空图像。
docker system prune -a
我想添加这个简单的答案,因为我没有看到它,而且这个问题特别是“旧”而不是“全部”。
sudo docker container prune --filter "until=24h"
调整 24h 以适应您想要删除旧容器的任何时间跨度。
对于任何有兴趣的人,我从 qkrijger 中获取了示例并将其变成了全部清除(停止并全部删除)
docker stop `docker ps --no-trunc -aq` ; docker rm `docker ps --no-trunc -aq`
docker rm -f $(docker ps --no-trunc -aq)
会更快
要简单地删除正在运行的容器当前未使用的所有内容,我通常将其放入 Mac 上的 .bash_profile
中的以下 alias 将有所帮助:
alias dockerclean="docker ps -q -a | xargs docker rm -v && docker images -q | xargs docker rmi"
每当从命令行调用 dockerclean
时,它都会删除已停止的容器以及未使用的映像层。对于正在运行的容器和使用的图像,它将打印一条警告消息并跳过它。
docker images | grep "<none>" | awk '{print $3}' | xargs docker rmi
-rm
选项以在成功构建后删除中间容器。docker ps -a | awk 'NR > 1 {print $1}' | xargs docker rm
docker rmi $(docker images -q -f dangling=true)