podman logs 命令 内存100% 如何重新初始化容器?

我的命令是 podman logs --tail 10 xxxx

然后就眼睁睁看着内存张到100%,然后宕机

我清除了宿主机的日志,但是没有用

sudo rm /var/lib/containers/storage/overlay-containers/<container_id>/userdata/ctr.log


sudo find /var/lib/containers/storage/overlay-containers/ -name "ctr.log" -exec rm {} \;

命令是没有问题的,这个容器运行了很长时间,之前调试 打印日志都没有问题。但是时间长了,不知道是不是容器产生的日志过多,导致了logs 会占满内存。

有解决方案是 删除容器,然后再run一个出来,我不干,run 的一些参数我已经记不得了,或者就是不想删除后再run一个出来。

请问如果一个容器长时间运行,我现在想要初始化到它run 时候的状态,应该如何处理?

(我的容器里面是一个hyperf 的程序,在不停的调用接口 和定时任务,容易产生日志)

阅读 318
2 个回答

podman容器提取run 命令

导出容器配置项

podman inspect xxxx > containers.json

jq 提取run 命令

apt install jq

jq -r '.[0].Config.CreateCommand | join(" ")' container.json

原理就是:

将这个json 文件中的第一个数组中的Config下面的 CreateCommand 数组按照空格 拼接成一条语句,就是你的podman run 命令了

注意事项:

按照这个步骤提取出来的 run 还有问题,比如

podman run --name hyperf \
-v /home/code/www/xxx:/data/project \
-w /data/project \
-p 9501:9501 \
--network my_network \
--entrypoint /bin/sh \
-d \
hyperf/hyperf \
-c "php bin/hyperf.php start"

其中的-c 里面的参数是个字符串有引号的,但是通过上面的方法提取出来的是没有引号。你拿着没有引号的run脚本去执行是要出问题的,会导致容器无法直接使用

podman run --name hyperf -v /home/code/www/xxx:/data/project  -w /data/project  -p 9501:9501  --network my_network  --entrypoint /bin/sh  -d  hyperf/hyperf  -c php bin/hyperf.php start

这个run 命令就是有问题的!需要手动加上引号

总结log 导致内存100% 宕机问题

  • 多问不同的ai
现在我严重怀疑是ai 给我清除日志的方法是错误的,下面我贴出所有ai的方法
  • 清除日志

    podman stop $(podman ps -aq)
    
    sudo rm /var/lib/containers/storage/overlay-containers/<container_id>/userdata/ctr.log
    
    sudo find /var/lib/containers/storage/overlay-containers/ -name "ctr.log" -exec rm {} \;
    
    sudo rm -rf /var/log/containers/*
    
    sudo rm -rf /var/lib/containers/storage/overlay-containers/*/*.log
    
  • 删除容器重新创建
#备份
podman inspect xxxx > containers.json
#安装jq
apt install jq -y
#输出你的容器run 脚本
jq -r '.[0].Config.CreateCommand | join(" ")' container.json
#停止容器
podman stop xxx
#删除容器
podman rm xxx
#创建容器(复制上面输出的run脚本)
podman run xxx

删除容器再run, 虽然能彻底清理状态,但容易丢失参数、挂载、网络配置等。不适合生产环境中“临时修复”问题。可以创建一个定时任务,每天或每周清理日志并重启容器。


🛠 完整的 Podman 容器日志清理与优化方案

🔍 场景说明

问题:容器长时间运行,日志文件过大,导致内存暴涨(执行 podman logs 时达到 100%)。
目标:不删除容器、不重新 run,但能清理日志、释放内存,使容器恢复正常运行。
容器 ID<container_id>(请替换为实际 ID)。


步骤一:查找容器 ID(如果尚未获取)

podman ps -a

📌 目的:找到需要操作的 CONTAINER IDNAME


步骤二:截断日志文件(释放磁盘空间)

sudo truncate -s 0 /var/lib/containers/storage/overlay-containers/<container_id>/userdata/ctr.log

这一步是安全的,不会影响容器运行,只是把日志清空。
⚠️ 注意:不要使用 rm 删除日志文件!Podman 可能仍然持有 文件描述符,强制删除会导致异常。


步骤三:重启容器(释放内存)

podman restart <container_id>

📌 作用

  • 释放内存,避免日志文件过大导致性能问题。
  • 不会影响 容器的数据或配置,是安全的“软重启”。

步骤四(可选):验证日志是否清空

podman logs <container_id>

📌 检查点:如果一切正常,应该 只看到最新的日志输出,旧日志已被清理。


步骤五(可选):设置定期清理脚本(预防日志膨胀)

🖥 创建自动化清理脚本

#!/bin/bash

CONTAINER_ID=<your_container_id>

# 截断日志
truncate -s 0 /var/lib/containers/storage/overlay-containers/$CONTAINER_ID/userdata/ctr.log

# 重启容器
podman restart $CONTAINER_ID

📌 保存到文件 /usr/local/bin/clean_podman_logs.sh
📌 赋予执行权限

chmod +x /usr/local/bin/clean_podman_logs.sh

设置定时任务(假设每天凌晨 3 点执行)

crontab -e

📌 添加以下内容

0 3 * * * /usr/local/bin/clean_podman_logs.sh >> /var/log/podman_log_clean.log 2>&1

此任务将每天自动清理日志,并防止日志导致内存占用过高!


撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题