docker容器读取另一个容器日志

时间:2019-03-20 20:40:47

标签: docker

我想创建一个docker连续读取另一个容器“ factorio”中的日志,stdout和stderr。

我知道我应该以卷的形式执行此操作,但是我目前最好的选择是

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

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

在后台运行并不断更新文件。我的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日志包含此信息

2 个答案:

答案 0 :(得分:2)

使用共享卷。您不需要docker-compose。

您可以在official documentation中了解更多信息。

但是基本思想是创建一个卷,然后将该卷加载到两个容器中。 然后将所需的日志/文件存储在该卷中,您可以从其他容器中读取该文件。

如果您也想在容器外部访问它,也可以使用文件系统上的文件夹并将其作为卷挂载。

答案 1 :(得分:1)

因此,如何在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是一个高级选项,可以根据提供的源来安装volumebind-mount

  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 可以大大简化多种容器,卷等的编排>