ChatGPT解决这个技术问题 Extra ChatGPT

如何删除旧的 Docker 容器

此问题与 Should I be concerned about excess, non-running, Docker containers? 有关。

我想知道如何删除旧容器。 docker rm 3e552code34a 允许您删除一个,但我已经有很多了。 docker rm --help 不提供选择选项(如全部或按图像名称)。

也许有一个存储这些容器的目录,我可以轻松地手动删除它们?

您还应该考虑清理孤立的 docker 卷。 我经常发现它们比旧容器和旧图像消耗更多的空间。用于删除孤立 docker 卷的良好脚本可在以下位置获得:github.com/chadoe/docker-cleanup-volumes
也许 github.com/chadoe/docker-cleanup-volumes 可以帮助您。
您还可以将 docker run--rm 标志一起使用,这会使容器短暂,在运行后删除所有容器文件。
对于 docker 1.13(2016 年第四季度),您还可以考虑使用新的 docker system prune 命令。请参阅my answer below
使用 docker 管理工具 Portainer 我们可以使用此工具进行管理all the old containers, non using volumes and images 它是一个简单的 docker 管理 UI Please refer my update below on how to deploy the application

s
slhck

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


删除所有未标记图像的类似命令:docker images | grep "<none>" | awk '{print $3}' | xargs docker rmi
@MichelMüller 从 dockerfile 构建映像时,您可以指定 -rm 选项以在成功构建后删除中间容器。
@MichelMüller 图像用于缓存,因此删除容器不会影响。
如果您想为此使用 awk,请考虑此命令,如果您想执行 rm 所有已停止的容器(由于第一行而没有错误):docker ps -a | awk 'NR > 1 {print $1}' | xargs docker rm
这应该是用于删除未标记图像的更新命令 docker rmi $(docker images -q -f dangling=true)
C
Community

我从 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 26108commit 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) 呢?
@qkrijger,除了添加bashism之外,这不会改变您原来的答案。问题在于命令行溢出。 xargs 变体以一种很好的方式处理它。我还将 --no-trunk 添加到 docker ps 以避免(不太可能)id 冲突。
请注意,如果您使用纯数据容器,它也会删除它们
我看不出 --no-trunc 有什么意义,因为 docker rm 无论如何都不需要完整的 ID。
P
Peter Mortensen

更新答案现在使用 docker system prunedocker container prune。请参阅VonC's updated answer

上一个答案组合上面的几个不同的提示,删除所有非运行容器的最优雅的方法似乎是:

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

-q 仅打印容器 ID(没有列标题)

-f 允许您过滤打印的容器列表(在这种情况下,我们正在过滤以仅显示退出的容器)


这应该是正确的答案,因为它依赖 docker 告诉你哪些容器不再使用,而不是假设 $(docker images) 的文本输出格式不会改变。仅产生一个额外进程而不是两个进程的奖励积分。
您可能需要添加 -v 以避免悬空卷:docker rm -v $(docker ps -q -f status=exited)。有关悬空卷的详细信息,请参阅 docs.docker.com/userguide/dockervolumes/…
@rluba 显然在 Docker 1.9 中将有一个单独的卷 api 来处理该问题。 github.com/docker/docker/pull/14242
别名可能很方便:alias docker-gc="docker rm -v \$(docker ps -q -f status=exited)"
与标记为正确的答案不同,@RyanWalls 答案适用于 OSX 并且更简洁。
P
Peter Mortensen

The official way 是:

docker rm `docker ps -aq`

Docker 维护人员表示不会有此命令 - 您可以这样编写命令:

我们之前已经讨论过这一点,并且希望用户使用上面的行,而不必向 Docker 添加额外的代码。


这是一个糟糕的解决方案,因为它还会删除存储容器。
你是什么意思“存储容器”?如果您指的是曾经用于保存对数据卷的引用的纯数据容器,那么由于 docker volume 子命令和命名卷的可用性,这些容器不再需要。
请注意,这在 Windows Powershell 中不起作用。为此,这是一个更好的解决方案:stackoverflow.com/a/23674294/1150683
@Sobrique如果您不做出反应,至少您应该删除您的评论,这几乎是完整且有害的废话。
V
VonC

使用 Docker 1.13(2016 年第四季度),您现在拥有:

docker system prune -a 将删除所有未使用的数据(即按顺序:容器停止、没有容器的卷和没有容器的图像)。

没有 -a 的 docker system prune 将仅删除(对于图像)悬空图像或没有标签的图像,如 smilebombcommented

请参阅 PR 26108commit 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 图像或没有标记的图像。
l
levi

2021 年更新(最新)

docker container prune

这 - 2017(旧)方式

删除所有停止的容器

docker rm $(docker ps -a -q)

删除所有容器(已停止和未停止)

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

否决票,因为这肯定不是您在 2017 年这样做的方式 - 应该是 docker volume/container/image prune,请参阅 stackoverflow.com/a/39860665/3625317
赞成反对反对票,因为a)这个答案来自2016年,并且b)很多人都没有走在最前沿。
未知速记标志:'a' in -a (Windows10)
我们可以通过使用过滤器选项简单地使用它来删除容器注意:直到 = 24h 表示 24 小时,您可以相应地更改它。 >> docker container prune --filter "until=24h"
c
caktux

现在可以将 filteringdocker ps 一起使用:

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

对于 images

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

但是,当没有匹配的容器时,其中任何一个都会导致 docker rmdocker 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 来获取未运行且从未运行过的那些。
C
Community

删除所有停止的容器:

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 。


K
Konstantin Pereiaslov

如果您不想删除所有容器,可以使用 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 中。我认为额外的容器没有其他危害,但会占用磁盘空间。


L
L0j1k

更新:从 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

P
Peter Mortensen

这是我的 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


@BradMurray 谢谢!您可能还喜欢这些:github.com/blueyed/dotfiles/commit/…
由于 xargs --no-run-if-empty 选项,无法在 OSX 上运行
C
Community

首先,在尝试移除容器之前停止运行容器

删除正在运行的容器

docker rm $(docker stop -t=1 $(docker ps -q))

您可以使用 kill 而不是 stop。就我而言,我更喜欢 stop,因为我倾向于重新运行它们而不是每次都创建一个新的,所以我尝试很好地关闭它们。

注意:尝试停止容器会报错:

错误:无法移除正在运行的容器,请先停止它

移除所有容器

docker rm $(docker ps -a -q)

B
Bartosz Bilicki

从 Windows shell 中删除所有容器:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i

我会在我的答案中包含这个,因为那是第一页。谢谢
“来自 Windows 外壳”?您的意思是“使用 Windows shell (CMD)”吗?
P
Peter Mortensen

https://github.com/HardySimpson/docker-cleanup

码头工人清理

一个小巧的一体式外壳,可移除:

超过一天前未运行的容器

不属于任何剩余容器的图像

打算作为 crontab 作业运行

特征

它将删除所有 : 图像

如果图像有多个 repo:tag 引用,它将删除所有 repo:tag ,除非运行容器。实际上它是“docker rmi”的一种性质。

许多错误信息将显示在屏幕上,您可以决定是否 2>/dev/null

从 docker-gc 学习一些东西,并解决它的问题(它不能删除具有多个 repo:tag 的图像)


P
Peter Mortensen

因此,我个人建议将此作为映像和容器的部署脚本的一部分,只保留最近的 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 imagesdocker ps 都按日期排序,我们可以只使用 tail 来选择除前三个之外的所有内容并将它们删除:

docker rmi $(docker images -q | tail -n +4)

将其与您的部署脚本(或本地)一起运行,以始终保留足够的图像以轻松回滚,而不会占用太多空间或将旧图像弄乱。

就个人而言,我在任何时候都只在我的生产箱上保留一个容器,但如果你想要更多,你可以对容器做同样的事情:

docker rm $(docker ps -aq | tail -n +4)

最后,在我的简化示例中,我们一次只处理一个存储库,但如果您有更多,您可以使用相同的想法变得更复杂一些。假设我只想保留 some_repo/some_image 中的最后三张图片。我可以混合使用 grepawk 并继续前进:

docker rmi $(docker images -a | grep 'some_repo/some_image' | awk '{print $3}' | tail -n +4)

同样,同样的想法也适用于容器,但你现在已经明白了,所以我将不再举例。


P
Peter Mortensen

利用:

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

它强制停止并删除本地存在的所有容器。


请编辑更多信息。不鼓励使用纯代码和“试试这个”的答案,因为它们不包含可搜索的内容,也没有解释为什么有人应该“试试这个”。我们在这里努力成为知识的资源。
在 ubuntu 16.04 中,docker 需要 sudo,所以必须写 sudo docker rm -f $(sudo docker ps -a -q)
另外,这也适用于 powershell 下的 Windows!
@Elliott 我认为 sudo 在任何地方都是必需的,除非您将用户添加到“docker”组。我通过将我的用户添加到 docker 组来使用没有 sudo 的 ubuntu 16.10。
P
Pithikos

删除 5 个最旧的容器:

docker rm `docker ps -aq | tail -n 5`

查看还剩多少个容器:

docker ps -aq | wc -l

干得好@Pithikos。我添加了删除所有旧容器的答案。
R
Ric_Harvey

移除所有停止的容器。

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")


不要忘记通过指定 -v 选项来删除 docker 卷(sudo docker rm -v $(sudo docker ps -a -q))
没有查到这个,但我猜与:docker ps -aq | xargs docker rm -v
这仅适用于 Linux,不适用于 Windows...但 docker rm -f $(docker ps -a -q) 适用于 Windows 的 PowerShell / Docker。
f
f-society

新方法: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

有趣的选择。 +1
P
Peter Mortensen

删除所有 docker 进程: docker rm $(docker ps -a -q) 删除特定容器: $ docker ps -a (列出所有旧容器) $ docker rm container-Id


P
Peter Mortensen

您可以使用以下命令删除已退出的容器:

docker rm $(sudo docker ps -a | grep Exit | cut -d ' ' -f 1)

以下是删除 docker 上旧图像的完整要点:Gist to remove old Docker containers and images


m
mckoss
#!/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

对于那些不想自己搜索的人github.com/spotify/docker-gc
这是完美的。我还写了一个具有相同功能的答案。
M
Marcin Szymczak

您只能删除已停止的容器。一开始就停止所有这些

docker stop $(docker ps -a -q)

然后你可以删除

docker rm $(docker ps -a -q)


P
Peter Mortensen

我总是使用 docker rmi $(docker ps -a -q) 删除所有图像。

docker rmi 失败时,您可以删除目录 /var/lib/docker/graph


感谢您添加 /var/lib/docker/graph 信息
问题是如何移除容器,而不是图像。
C
Community

停止/删除所有容器和图像的基本步骤

列出所有容器 docker ps -aq 停止所有正在运行的容器 docker stop $(docker ps -aq) 删除所有容器 docker rm $(docker ps -aq) 删除所有图像 docker rmi $(docker images -q)

注意:首先,您必须先停止所有正在运行的容器,然后才能删除它们。同样在删除图像之前,您必须停止并删除其依赖容器。


S
Sijo M Cyril

我正在使用以下命令删除 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}')

P
Pal

试试这个命令来清理容器和悬空图像。

docker system prune -a

这是一个了不起的专业提示!
e
edencorbin

我想添加这个简单的答案,因为我没有看到它,而且这个问题特别是“旧”而不是“全部”。

sudo docker container prune --filter "until=24h"

调整 24h 以适应您想要删除旧容器的任何时间跨度。


K
Kraig McConaghy

对于任何有兴趣的人,我从 qkrijger 中获取了示例并将其变成了全部清除(停止并全部删除)

docker stop `docker ps --no-trunc -aq` ; docker rm `docker ps --no-trunc -aq`

如果您仍然要移除容器,那么 docker rm -f $(docker ps --no-trunc -aq) 会更快
没错,但是如果您需要它通过正确的关闭来清理共享或重用的资源(即附加卷、正确关闭的活动连接等),那么您需要先调用 stop。很好的例子,如果你有一个 Jenkins 容器,那么杀死容器是个坏主意。您希望它保存任何未持久的更改,警告登录的用户,并且非常重要的是,正确停止所有构建。
同意,这是一个非常有效的用例
P
Peter Mortensen

要简单地删除正在运行的容器当前未使用的所有内容,我通常将其放入 Mac 上的 .bash_profile 中的以下 alias 将有所帮助:

alias dockerclean="docker ps -q -a | xargs docker rm -v && docker images -q | xargs docker rmi"

每当从命令行调用 dockerclean 时,它都会删除已停止的容器以及未使用的映像层。对于正在运行的容器和使用的图像,它将打印一条警告消息并跳过它。