首页 > 解决方案 > docker 容器读取另一个容器日志

问题描述

我想创建一个 docker,它可以连续地从另一个容器“factorio”中读取日志、stdout 和 stderr。

我知道我应该把它作为一个卷来做,但我目前最好的选择是

sudo docker logs -f factorio &> /var/log/factorio/current.logs

我在屏幕上运行上述内容。我将它作为后台命令,但是当您退出终端时,它会退出该命令。Screen 允许它在自己的终端上运行。

它在后台运行并不断更新文件。我的 newapp 容器以卷的形式连接到此文件位置,每 5 秒拖尾一次以获取任何更新并根据这些更新发送通知。肯定有更好的方法来处理卷,但我不知道如何。

someapp docker 命令如下:

sudo docker run -d \
  -p 34197:34197/udp \
  -p 27015:27015/tcp \
  -v /opt/factorio:/factorio \
  --name factorio \
  --restart=always \
  dtandersen/factorio:0.17.16

日志文件是/opt/factorio/factorio-current.log但不包括 stdout 或 stderr。docker logs 包含此信息

标签: docker

解决方案


因此,如何在 docker 上处理该问题的首选方法是使用volume

因此,如本页所述,您的第一个目标是创建所述卷,请注意卷实际上只是某种命名的挂载点。

  1. 创建您的音量
docker volume create factorio_logs
  1. (可选步骤,但可能对以后有用):验证您的卷是否存在:
docker volume ls
  1. 将您的应用程序日志生成器链接到您的卷
docker run -d \ 
  -p 34197:34197/udp \
  -p 27015:27015/tcp \
  # adapt the line below to wherever your application is configured to store logs
  -v factorio_logs:/var/log/factorio \ 
  --name factorio \
  --restart=always \
  dtandersen/factorio:0.17.16

注意: -v 是一个高级选项,可以根据给定的源挂载绑定挂载

  1. 创建您的消费者容器并安装卷(这只是一个tail -f示例)
docker run -ti -v factorio_logs:/var/log/factorio alpine tail -f /var/log/factorio/*.log

请注意,体积会在容器的生命周期之外持续存在。您必须手动清除该卷并重新创建它以清除您的日志

docker volume rm factorio_logs
docker volume create factorio_logs

另请注意,使用docker-compose可以大大简化多个容器、卷等的编排


推荐阅读