关于如何节省空间的建议?

我们在 DigitalOcean 上运行了一个自托管的 Discourse 站点,拥有一个 25 GB 的磁盘。我刚刚尝试更新我们的 Discourse 镜像,收到了需要更多空间才能继续的消息。在清理了 docker 镜像和容器后,我们仍然缺少 0.4 GB。

有什么节省空间的建议吗?既为了立即更新,也为了将来节省空间。我知道我们很快就需要调整大小,但能够至少再进行一次 Discourse 镜像更新将非常有帮助。

4 个赞

您是否在本地存储备份?
如果是,也许删除一些旧的备份会有所帮助。0.4GB(即400MB)应该可以处理。

您也可以尝试清理主机系统上的一些空间。

1 个赞

尝试重启服务器,然后如果确定有足够的空间,请重试。

我们使用 DigitalOcean 的备份功能。我没有看到手动删除我们某个备份的选项。

我该如何着手进行?我没有编程经验,但在得到一些指导后,我能够理解做什么以及为什么这样做。

尝试重启后没有变化。

运行 sudo du -h --max-depth 1 后,结果如下:

尝试清理未使用的 Docker 对象

1 个赞

此时,我会省去麻烦,现在就进行调整大小的工作。

3 个赞

我清理了除未使用的卷之外的所有内容,因为 docker volume ls 显示我们只有一个。

你试过了吗?

./launcher cleanup

1 个赞

是的!

不过,我通过 docker images -a 更深入地研究了我们的 Docker 镜像,看到了这个。

<none> 是怎么回事?

1 个赞

搜索了一下,我找到了这个非常有趣的评论。

rofranoJohn Rofrano

Nov '17

为了避免它们,理解为什么会出现中间未标记的镜像并显示为 <none> <none> 非常重要,因为正如你所见,如果它们正在被使用,你就无法删除它们。

未标记镜像出现的原因是,你构建了一个镜像,然后更改了 Dockerfile 并再次构建了该镜像,它重用了上一个构建的一些层。现在你有一个未标记的镜像,由于它的一些层被新版本的该镜像使用,因此无法删除。

解决方案是:

  • 删除新版本的镜像
  • 删除未标记的镜像,然后
  • 重新构建新版本的镜像,使其拥有所有层。

你将只剩下一个标记的镜像,其中包含之前未标记镜像和新镜像的所有层。

~jr

我没想到会在一个的docker镜像中找到2.64 GB的内容,所以现在我正在试图弄清楚那里发生了什么。如果我根本不需要这个镜像,那么我们肯定离需要调整大小还有很长的路要走。

你是否执行了

./launcher cleanup

但我建议你调整大小。我很惊讶你能在 25GB 的情况下坚持这么久。

另外,你是否查看了 shared/backups/default

我绝对不会信任 DigitalOcean 的备份作为备份论坛的手段。

2 个赞

多久?我没看到任何提示——我确实知道我乐于运行一个20G的论坛和一个25G的论坛。

在共享目录中,你可能有很多备份数据(可能在 shared/standalone/backups/default 中)。你也可能有一些旧的数据库副本或旧的日志文件。我建议你运行
du -kx / | sort -n | tail -49
或类似的命令。

值得注意的是,你可以通过迁移到更大的实例来节省时间,但会花费更多的金钱。或者你可以做相反的权衡。

这让我有点担心。DO 也许能帮你备份整个系统,但如果是我的话,我会更想知道如何备份 Discourse 以及如何获取安全的本地副本。以及如何清理备份。(万一 DO 删除你的实例和账户,你会希望你的数据能够幸免。)

:woman_facepalming:t3: 我们也使用 Discourse 的备份功能,我意识到我们还没有在那里清理旧的备份。

好了,我删除了 Discourse 界面中除最新备份之外的所有备份,并将最新的备份下载到了我的本地驱动器。这样我就离空间不足还有不到 100MB 了。

这是我在 var/discourse 中运行该命令时得到的结果

656876  /var/lib/docker/overlay2/81fd81f27d0d8fe795f510fe8d70c4ecad96405b0e1dbb57f0440fe9c398a30d/diff/var/www/discourse
819624  /var/log/journal/e734ad1931dbee4740881cc15c9e7a9a
826292  /var/discourse/shared/standalone
826296  /var/discourse/shared
831476  /var/lib/docker/overlay2/7bedcd4746ebce6e3fe7bbb5ec2c987a1c046efc715fad1e53201b18b97b6058/diff/home/discourse/.cache/yarn/v6
831484  /var/lib/docker/overlay2/7bedcd4746ebce6e3fe7bbb5ec2c987a1c046efc715fad1e53201b18b97b6058/diff/home/discourse/.cache/yarn
831492  /var/lib/docker/overlay2/7bedcd4746ebce6e3fe7bbb5ec2c987a1c046efc715fad1e53201b18b97b6058/diff/home/discourse/.cache
832188  /var/discourse
845992  /lib/modules
850136  /var/lib/docker/overlay2/7bedcd4746ebce6e3fe7bbb5ec2c987a1c046efc715fad1e53201b18b97b6058/diff/home/discourse
850144  /var/lib/docker/overlay2/7bedcd4746ebce6e3fe7bbb5ec2c987a1c046efc715fad1e53201b18b97b6058/diff/home
898764  /var/lib/docker/overlay2/58e9df9d9e2e10efb3dcf68771edd172664f8d91e3aa2e0b280fd4549bfd2a91/diff/usr/lib
966656  /var/lib/docker/overlay2/21f4d6109bd809c584ae84f9f7c50286c6126176f86a2ef61c4c24ce1e633765/diff/var/www/discourse
966660  /var/lib/docker/overlay2/21f4d6109bd809c584ae84f9f7c50286c6126176f86a2ef61c4c24ce1e633765/diff/var/www
966664  /var/lib/docker/overlay2/21f4d6109bd809c584ae84f9f7c50286c6126176f86a2ef61c4c24ce1e633765/diff/var
991800  /var/lib/docker/overlay2/21f4d6109bd809c584ae84f9f7c50286c6126176f86a2ef61c4c24ce1e633765/diff
991816  /var/lib/docker/overlay2/21f4d6109bd809c584ae84f9f7c50286c6126176f86a2ef61c4c24ce1e633765
994980  /var/lib/docker/overlay2/2749f8a24b3e28af399b256ecab7f2db0cb146939a0ef56e83858a0e696c3df6/diff/usr/lib
1089092 /var/lib/docker/overlay2/9817d45d2728572ad6dc4d62df5944dfad69c35b76753ceb260e0130863ece49/diff/var/www/discourse
1089096 /var/lib/docker/overlay2/9817d45d2728572ad6dc4d62df5944dfad69c35b76753ceb260e0130863ece49/diff/var/www
1130168 /var/lib/docker/overlay2/9817d45d2728572ad6dc4d62df5944dfad69c35b76753ceb260e0130863ece49/diff/var
1177644 /var/lib/docker/overlay2/9817d45d2728572ad6dc4d62df5944dfad69c35b76753ceb260e0130863ece49/diff
1177660 /var/lib/docker/overlay2/9817d45d2728572ad6dc4d62df5944dfad69c35b76753ceb260e0130863ece49
1224436 /var/lib/docker/overlay2/81fd81f27d0d8fe795f510fe8d70c4ecad96405b0e1dbb57f0440fe9c398a30d/diff/var/www/discourse
1224440 /var/lib/docker/overlay2/81fd81f27d0d8fe795f510fe8d70c4ecad96405b0e1dbb57f0440fe9c398a30d/diff/var/www
1224444 /var/lib/docker/overlay2/81fd81f27d0d8fe795f510fe8d70c4ecad96405b0e1dbb57f0440fe9c398a30d/diff/var
1234612 /lib
1248080 /var/lib/docker/overlay2/81fd81f27d0d8fe795f510fe8d70c4ecad96405b0e1dbb57f0440fe9c398a30d/diff
1248096 /var/lib/docker/overlay2/81fd81f27d0d8fe795f510fe8d70c4ecad96405b0e1dbb57f0440fe9c398a30d
1342320 /var/lib/docker/overlay2/58e9df9d9e2e10efb3dcf68771edd172664f8d91e3aa2e0b280fd4549bfd2a91/diff/usr
1516440 /usr
1543656 /var/lib/docker/overlay2/7bedcd4746ebce6e3fe7bbb5ec2c987a1c046efc715fad1e53201b18b97b6058/diff/var/www/discourse
1543664 /var/lib/docker/overlay2/7bedcd4746ebce6e3fe7bbb5ec2c987a1c046efc715fad1e53201b18b97b6058/diff/var/www
1558580 /var/lib/docker/overlay2/7bedcd4746ebce6e3fe7bbb5ec2c987a1c046efc715fad1e53201b18b97b6058/diff/var
1659548 /var/lib/docker/overlay2/58e9df9d9e2e10efb3dcf68771edd172664f8d91e3aa2e0b280fd4549bfd2a91/diff
1659564 /var/lib/docker/overlay2/58e9df9d9e2e10efb3dcf68771edd172664f8d91e3aa2e0b280fd4549bfd2a91
2040472 /var/lib/docker/overlay2/2749f8a24b3e28af399b256ecab7f2db0cb146939a0ef56e83858a0e696c3df6/diff/usr
2171304 /var/log/journal/d893af269dfb5f73239a5b6761d49ea0
2388612 /var/lib/docker/overlay2/2749f8a24b3e28af399b256ecab7f2db0cb146939a0ef56e83858a0e696c3df6/diff
2388628 /var/lib/docker/overlay2/2749f8a24b3e28af399b256ecab7f2db0cb146939a0ef56e83858a0e696c3df6
2461904 /var/lib/docker/overlay2/7bedcd4746ebce6e3fe7bbb5ec2c987a1c046efc715fad1e53201b18b97b6058/diff
2461924 /var/lib/docker/overlay2/7bedcd4746ebce6e3fe7bbb5ec2c987a1c046efc715fad1e53201b18b97b6058
3064672 /var/log/journal
3276268 /var/log
10107180        /var/lib/docker/overlay2
10131984        /var/lib/docker
10396840        /var/lib
14869684        /var
20007992        /

我收到了关于如何处理以下内容的附加说明:

详细信息如下:

rofranoJohn Rofrano

1

20h

删除镜像的命令是:

docker rmi {image_name}

其中 {image_name} 是你要删除的镜像的名称。你也可以使用镜像 ID 来删除镜像(例如 docker rmi {image_id})。这就是你需要用来删除名称为 <none> 的镜像的方法。

例如,假设你有以下镜像:

REPOSITORY           TAG        IMAGE ID       CREATED              SIZE
my-new-image         latest     c18f86ab8daa   12 seconds ago       393MB
<none>               <none>     b1ee72ab84ae   About a minute ago   393MB
my-image             latest     f5a5f24881c3   2 minutes ago        393MB

无法删除 <none> 镜像的原因可能是 my-new-image 正在使用它的某些层。你需要做的是:

docker rmi my-new-image:latest
docker rmi b1ee72ab84ae
docker built -t my-new-image .

这会删除正在重用 <none> 镜像的层的 my-new-image:latest。然后它使用镜像 ID b1ee72ab84ae 删除 <none> 镜像。最后,它会重新构建 my-new-image,创建所有需要的层。

还要检查以确保没有停止的容器仍在使 <none> “未标记”镜像。使用 docker ps -a 查看所有镜像,包括已退出的镜像。如果是这样,请使用 docker rm {container_id} 删除容器,然后再次尝试删除 <none> 镜像。

大家觉得怎么样?

我认为你可以在这里改进:

看看这个早期的交流:

3 个赞

这解决了问题,我也更改了策略!

我仍然想找出那个 <none> 镜像的问题(因为它占用了 2GB+ 的空间,这太离谱了),但你已经解决了我的燃眉之急,为我腾出了升级所需的空间!谢谢你!!

3 个赞

确实如此!就目前而言,我乐在其中,学习新东西,所以时间是值得的。