我在码头上运行tomcat,但我看不到日志。它们被写入到tomcat/logs下的各种日志文件中,但是当tomcat在docker容器中运行时,我看不到它们。
这是我的Dockerfile
FROM tomcat:7-jre8
COPY target/MYAPP.war /usr/local/tomcat/webapps/MYAPP.war
RUN ["/usr/local/tomcat/bin/catalina.sh", "start"]
这就是我如何构建镜像并从它启动容器:
docker build -t MYAPP .
docker run -it --rm -p 8080:8080 --name MYAPP MYAPP
我的应用在tomcat部署MYAPP.war后创建日志文件: /var/ log /MYAPP.log
我应该如何修改Dockerfile,应该使用哪个命令来运行它("docker run ...")因此,在使用"docker run stdout --rm -p 8080:8080 --name MYAPP MYAPP“启动容器MYAPP之后,/var/ -it /MYAPP.log内容将立即打印到stdout?
我试图将下面的命令添加到Dockerfile中,但是没有帮助。
CMD tail -f /usr/local/MYAPP.log
发布于 2018-06-07 06:26:03
好的,您的dockerfile应该包含这样的内容**
from tomcat:7-jre8
copy target/myapp.war /usr/local/tomcat/webapps/myapp.war
entrypoint ["/bin/bash", "/usr/local/tomcat/bin/catalina.sh", "run"]
然后,您可以运行基于此镜像的容器,如下所示:
docker run -itd -p 8080:8080 --name aname animage
因此,catalina 'run‘命令旨在将所有日志重定向到stdout。这对我们很有用,因为这就是docker的工作方式。如果您现在运行容器,您将能够运行:
docker logs aname
输出将是已发送到容器内的stdout的任何内容。您可以随心所欲地执行此操作,但常见的策略是将日志传输到logstash、splunk或上千个其他位置,或者您可以将其写入文件(尽管最后一个文件主要供开发人员使用)。
**当然,您必须更改入口点以匹配您的安装细节。我在这里显示的run命令是针对守护进程的。
原始问题:您最初的问题是基于一个常见的错误;您试图在配置(构建映像)过程中运行tomcat服务器。当您运行容器时,您实际上想要运行服务器。因此,我删除了run
并将其替换为入口点,这是运行如下命令的正确方式。最后,cmd
用于向入口点传递参数,在本例中我们不需要这些参数。
最后,我选择使用cataline.sh run
而不是start
,因为run
旨在将日志发送到标准输出,而不是像start
那样将日志发送到文件。
参考文献
查看日志:https://docs.docker.com/config/containers/logging/
会议日志:https://docs.docker.com/config/containers/logging/configure/
发布于 2020-07-07 22:36:00
在这里找到了一个很好的方法:https://github.com/Scout24/tomcat-stdout-accesslog/issues/2
更换server.xml文件中的以下阀门。
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/proc/self/fd"
prefix="1" suffix="" rotatable="false"
pattern="%h %l %u %t "%r" %s %b" />
仅适用于Linux!
这种“很好的方式”对我来说不出所料。
发布于 2017-12-08 22:08:18
将日志直接写入标准输出可能会比将日志直接写入容器中的文件更好。它将在重启后丢失。
有关详细信息,请参阅https://12factor.net/logs
https://stackoverflow.com/questions/47715280
复制相似问题