docker 中的程序的输出(比如 `print`) 会被保存到磁盘吗?

问题描述

服务器中的容器在运行了几天后,磁盘被占满了,经过查找大文件,发现/var/lib/docker路径下container 文件夹中有个以log结尾的文件非常大。删除后把程序启动起来,过了半小时在查看该目录:
ix62tS.md.jpg

问题出现的环境背景及自己尝试过哪些方法

当时临时办法是写了一个脚本定时删除该log文件。

代码中只有print输出,并没有保存log文件。

后来修改代码把打印输出去掉,就没有再出现log文件。我怀疑是docker自动收集了这些打印。

最后我还是不太确定是否是因为 docker会自动收集这些打印 而导致服务器磁盘占满。请各位前辈指点迷津。

阅读 9.1k
2 个回答

经过查阅资料了解到:

  • 上面的日志都属于标准输出(stdout),python 的 print golang的fmt.Println都属于stdout;
  • docker中日志记录机制称为日志驱动程序;

    • 每个 container 都是一个特殊的进程,由 docker daemon 创建并启动,由docker daemon守护和管理,所以docker daemon可以获取到container的stdout;
  • docker daemon 有一个默认的日志驱动程序,默认为json-file;

    • json-file 会把所有容器的标准输出和标准错误以json格式写入文件中,这个文件每行记录一个标准输出或标准错误并用时间戳注释;
  • 更改默认的日志启动程序即可,具体操作如下:

    • 编辑 docker deamon 配置文件:sudo vim /etc/docker/daemon.json
    • 增加一条:{"log-driver": "none"} (也可以添加{"log-opts": {"max-size": "10m" }} 来控制log文件的大小)
    • 重新加载配置文件并重启docker服务:sudo systemctl daemon-reloadsudo systemctl restart docker
    • 修改配置后重新启动识别任务,没有产生log文件。

资料参考地址:
Docker 生产环境之日志 - JSON File 日志驱动程序
配置日志驱动程序

你的print应该是存入到docker的日志中了。

  • 先查看下自己的日志信息,看下是否能够看到print的内容,如果有就是输出到log里了。
sudo docker logs -f container_id
  • 然后看下对应的日志的存储地址
sudo docker inspect container_id|grep log
  • 查看到地址log_path,查看对应的大小
sudo du -h log_path
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进