具有newrelic java代理和supervisord的Docker容器在首次启动时不发送数据

我们有一个Docker容器,它通过supervisord在tomcat7上运行一个java7应用程序。 我们希望通过newrelic来监控APM。

这是supervisordconfiguration文件

[program:tomcat] command=/home/ec2-user/tomcat7/bin/catalina.sh run environment=CATALINA_OPTS=" -javaagent:/home/ec2-user/tomcat7/newrelic/newrelic.jar" 

这里是我们在Dockerfile中添加newrelic.ymlconfiguration文件的地方

 COPY newrelic.yml /home/ec2-user/tomcat7/newrelic/newrelic.yml 

docker集装箱启动时,它运行supervisord,它正确启动Java应用程序。 虽然,如果我们连接到容器并转到tomcat7/newrelic文件夹,我们看不到创build的logs文件夹。 没有数据发送到新的,即使ps aux | grep tomcat ps aux | grep tomcat向我们展示了
-javaagent选项已正确传递:

 /usr/bin/java -Djava.util.logging.config.file=/home/ec2-user/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -javaagent:/home/ec2-user/tomcat7/newrelic/newrelic.jar -Djava.endorsed.dirs=/home/ec2-user/tomcat7/endorsed -classpath /home/ec2-user/conf:/home/ec2-user/tomcat7/bin/bootstrap.jar:/home/ec2-user/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/home/ec2-user/tomcat7 -Dcatalina.home=/home/ec2-user/tomcat7 -Djava.io.tmpdir=/home/ec2-user/tomcat7/temp org.apache.catalina.startup.Bootstrap start 

如果我们杀死容器中的tomcat7进程,supervisord会重新启动进程,然后我们看到“logs”文件夹出现,数据正确地发送到新的。

是否有任何理由为什么第一次supervisord开始的过程中,newrelic代理不附加,但在第二次启动呢?

  • supervisord版本:3.1.3
  • newrelic代理版本:3.21.0
  • tomcat版本:7
  • java版本:7
  • docker版本:1.7.1

我们发现问题:我们的tomcat中缺lesstemp文件夹。 如果该文件夹不存在,newrelic代理将不会启动,但会创build它。 这就解释了为什么我们第二次开始这个过程时,代理正确地挂钩了。