Docker container can only to daemon mode: I run
catalina.sh
to start the tomcat.catalina.out
.
我可以看看 `docker logs ,但这肯定不能在生产环境中运行。
请问如何在生产环境中,在容器不停止的情况下,将Tomcat的日志存入文件中?
如果你看官方tomcat docker image,它运行
CMD ["catalina.sh", "run"]
这足以在前台启动tomcat,在控制台上显示日志。
但是,正如您所说,这可能不会填充 catalina.out。
一个替代方案是:
CMD service tomcat start && tail -f /var/lib/tomcat/logs/catalina.out
在this(题外话)问题中有选项可以让tomcat日志在前台运行。
但要回答您的实际问题,docker logs 命令是从容器获取日志的常用方法。您还可以在主机上找到它们,因为它们存在于文件中。
但最好的办法是使用外部日志服务来收集和聚合日志,这样就不用登录生产服务器了。 Logentries 就是一个例子(尽管它远非完美)。 Splunk 是另一个。 Docker 日志记录驱动程序文档 可能会有所帮助。
您可以像这样覆盖 CMD:
CMD bash -c "catalina.sh run | tee -a logs/catalina.out"
但是如果你甚至想存储所有错误:
CMD bash -c "catalina.sh run |& tee -a logs/catalina.out"
像这样存储到卷中:
docker run --rm -it -v /some/place:/usr/local/tomcat/logs yourImage
您需要在 docker 容器中有一个在前台运行的进程才能让容器运行。
我对我所有的 docker 镜像都使用 hack。 使用以下代码创建脚本 run.sh
#!/bin/sh
service tomcat start
tail -f /dev/null
确保在 docker 中运行 run.sh 文件之前,更改权限。
添加到 Dockerfile 将是
COPY run.sh ./run.sh
RUN chmod 755 ./run.sh
CMD ["./run.sh"]