1

我在 Google Compute Engine 上的 Google Container OS 内托管了一个 Docker 映像。要部署我的容器,我这样做:

gcloud compute instances update-container example --container-image "$IMAGE_WITH_TAG"

在我最近的部署中,我收到了这个错误:

failed to register layer: Error processing tar file(exit status 1): write /usr/share/man/man1/journalctl.1.gz: no space left on device

SSH 连接到我的 Docker 容器后,我运行docker images并注意到 Docker 仍然挂在我的旧镜像上。我可以手动删除这些图像,但在多次部署后会出现同样的问题。

有没有办法在通过 Container OS 部署时自动删除旧的 Docker 映像gcloud compute instances update-container

4

2 回答 2

0

目前,Compute Engine 没有自动清理旧图像和未使用图像的功能。在 Compute Engine 上更新容器时执行的步骤中没有提及。

到目前为止,解决方法是运行以下命令来清除磁盘。您还可以添加关闭脚本:

docker rm  $(docker ps -q -a) \
docker images -q -f dangling=true | xargs docker rmi \
docker system prune --all

以上命令将执行以下操作:

  1. 删除所有停止的 docker 容器。
  2. 删除所有悬空图像。
  3. 删除所有未使用的图像和卷​​。

解释“悬空”和“未使用”图像之间的区别。

这个类似的答案提供了一个使用 prune 命令的示例和另一种解决方法,以确保在更新容器映像之前清除旧映像。

于 2021-09-20T07:41:10.367 回答
0

您可以尝试使用第三方工具GCR Cleaner 工具来帮助自动删除旧图像。所有新创建的图像都标有“最新”标签,因此它们不会被工具意外删除。

GCR Cleaner 删除 Google Cloud Container Registry 或 Google Cloud Artifact Registry中未标记的图像。这有助于降低成本并保持容器镜像列表井井有条。

GCR Cleaner 旨在部署为Cloud Run服务,并通过Cloud Scheduler定期调用。这不是 Google 的官方产品。

另一种方法是使用 prune 命令自动删除与容器无关的所有资源。这是清理未使用的映像、容器、卷和网络的一种简化方法。

在终端窗口中,输入以下内容:

$ docker system prune

可以包括其他标志:

-a 包括停止的容器和未使用的图像

-f 绕过确认对话框

--volumes 删除所有未使用的卷

运行 docker system prune -a会删除未使用的和悬空的图像。容器中使用的图像,无论是当前运行的还是退出的,都不会受到影响。

您还可以参考脚本来清理在特定日期之前推送的 Google Container Registry 映像。

于 2021-09-20T08:00:34.417 回答