由于docker日志导致EC2实例空间不足

由于docker日志导致EC2实例空间不足

我仍在学习 docker 和 AWS,并且我已经使用 50gb EBS 存储运行了一个 docker 进程一段时间,现在我的磁盘空间不足了,因此,当我重新启动实例时,docker 不再启动。

当我尝试时sudo du -h / | grep '[0-9\.]\+G'我得到:

1.8G    /var/lib/docker/containers/f7cf0...
17G     /var/lib/docker/containers/55b7e...
2.8G    /var/lib/docker/containers/987b0...
22G     /var/lib/docker/containers/726b0...
44G     /var/lib/docker/containers
4.3G    /var/lib/docker/devicemapper/devicemapper
4.3G    /var/lib/docker/devicemapper
48G     /var/lib/docker
48G     /var/lib
48G     /var
0       /sys/bus/mdio_bus/drivers/Generic 10G PHY
50G     /

当我尝试时,sudo docker ps -a我得到:

Cannot connect to the Docker daemon. Is 'docker -d' running on this host?

我不想触碰 726b0... 进程,这是最重要的。如果我删除 55b7e... 的 .log 文件,会不会造成问题?除了直接删除文件,有没有更干净的方法?

答案1

如果你使用Elastic Beanstalk运行Docker,这可能会让您感兴趣。

我采用了 Yonatan 的命令,并将其转换为一个.ebextensions每隔 X 小时运行一次的 cron 作业,并清除 Docker 容器日志,这样它们就不会累积并阻塞服务器。我不得不对其进行修改,tee以避免模糊重定向bash 错误。

.ebextensions只需在存储库根目录(旁边Dockerrun.aws.json)创建一个目录,并docker-log-truncate.config在其中创建一个包含以下内容的文件:

commands:
    add_docker_log_truncate_cronjob:
        command: "crontab -l | grep -q 'eb-docker' || (crontab -l ; echo '0 * */6 * * /bin/echo 0 | tee /var/log/eb-docker/containers/*/*.log')| crontab -"
        ignoreErrors: true

在这种情况下,该命令将每 6 天运行一次并清除您的 Docker 容器日志。请注意,在我终止所有受影响的服务器之前,我无法使用此更改更新我的 Elastic Beanstalk,可能是因为 Beanstalk 需要一些可用磁盘空间来部署新版本。

答案2

echo '' > /var/log/eb-docker/containers/*/*.log为了截断 5gb 的日志文件,我已经在实时生产服务器上成功执行,没有任何问题。

答案3

您可以将以下部分添加到 Docker 运行文件中:

"logConfiguration": {
    "logDriver": "json-file",
    "options": {"max-size": "100m", "max-file": "10"}
}

请参阅文档了解更多详细信息:https://docs.docker.com/config/containers/logging/json-file/

相关内容