【问题标题】:How to remove all associated containers and an image upon Docker build如何在 Docker 构建时删除所有关联的容器和映像
【发布时间】:2020-07-03 10:33:52
【问题描述】:

我正在构建 Docker 映像,想知道是否有一种快速方法可以删除从 docker build 构建的先前映像,并在 Docker 构建期间删除从该映像派生的任何先前渲染的容器。

我知道我可以单独执行此操作,方法是使用祖先过滤器删除与图像关联的所有容器(运行或停止):

docker rm -f $(docker ps -a -q --filter="ancestor=<image id>")

而且我也了解如何移除关联的容器:

docker rmi <image id>

但是,在下一次 docker 构建期间执行这两个步骤将是理想的。

【问题讨论】:

  • 如果您使用 Docker Compose,重新运行 docker-compose up 将删除并重新创建旧容器。不过,您仍然会堆积旧的构建映像。

标签: image docker


【解决方案1】:

但是,在下一次 docker 构建期间执行这两个步骤将是理想的。

编写这些步骤的脚本将是一个简单的解决方案,因为docker image build 本身没有这些图像清理选项。

您可以将 --no-cache 添加到您的 docker 构建中,以确保重建所有内容。

【讨论】:

  • 是的,好点。我认为将您的答案与@DavidMaze 评论结合起来是一个好方法。我发现不成功的构建确实会导致遗留中间容器,因此即使使用 docker-compose 也不能保证所有容器都会被删除。此外,在创建 dockerfile 时,使用 docker-compose build 可能是一种更好的方法。
【解决方案2】:

解决方案

  1. 将以下内容添加到您的 ~/.bashrc 或 ~/.zshrc 中
  2. source ~/.bashrc(或你在下面放置函数的文件)

删除图像和所有关联的容器

rem_image 14a7ba8dc2c0

**按图案删除所有图像**

docker_clean <PATTERN>

例如删除所有没有名称的图像(它们通常在构建步骤中失败)

docker images | grep none
<none>                                                <none>              e4205cbdcbd6        2 months ago        1.64GB
<none>                                                <none>              e5a21ccf4b6d        2 months ago        1.73GB
<none>                                                <none>              bd9b2ddf1a06        2 months ago        1.64GB
<none>                                                <none>              f7d08c6c4660        2 months ago        1.73GB
<none>                                                <none>              4bca4e8a7059        2 months ago        1.64GB
<none>                                                <none>              ab028586385c        2 months ago        1.73GB

docker_clean none

代码

function rem_image() {
  image_id=$1
  
  docker rm -f $(docker ps -a -q --filter="ancestor=$image_id") 2>&- || echo "Found no containers for that image"
  docker rmi $image_id
  echo "Image deleted successfully"
}

function docker_clean() {
  pattern=$1

  for image_id in `docker images | grep $pattern | awk '{ print $3}'`
  do
      echo Removing... $image_id
      rem_image $image_id
  done
}

【讨论】:

  • 你让我开心
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 2016-05-09
  • 2013-07-13
  • 2016-10-28
  • 2018-03-27
  • 2015-11-28
相关资源
最近更新 更多