在Docker中启动时,我的应用程序无法创build日志文件

我花了周末的时间翻阅了Docker文档,并玩弄了玩具应用程序和示例项目。 我现在试图写一个我自己的超级简单的Web服务,并从一个容器中运行它。 在容器中,我想要我的应用程序(一个引导下的Spring Boot应用程序) – 称为启动 – 具有以下目录结构:

/opt/ bootup/ bin/ bootup.jar ==> the app logs/ bootup.log ==> log file; GETS CREATED BY THE APP @ STARTUP config/ application.yml ==> app config file logback.groovy ==> log config file 

需要注意的是,当我在主机上本地运行我的应用程序(Docker之外)时,一切正常,包括将日志文件创build到我的主机的/opt/bootup/logs目录。 应用程序端点提供了正确的内容等。一切都很好,很棒。

所以我创build了下面的Dockerfile

 FROM openjdk:8 RUN mkdir /opt/bootup RUN mkdir /opt/bootup/logs RUN mkdir /opt/bootup/config RUN mkdir /opt/bootup/bin ADD build/libs/bootup.jar /opt/bootup/bin ADD application.yml /opt/bootup/config ADD logback.groovy /opt/bootup/config WORKDIR /opt/bootup/bin EXPOSE 9200 ENTRYPOINT java -Dspring.config=/opt/bootup/config -jar bootup.jar 

然后我通过以下方式构build我的图

 docker build -t bootup . 

然后我运行我的容器:

 docker run -it -p 9200:9200 -d --name bootup bootup 

我运行docker ps

 CONTAINER ID IMAGE COMMAND ... 3f1492790397 bootup "/bin/sh -c 'java ..." 

到现在为止还挺好!

然后,我的应用程序应该在localhost:9200服务一个简单的网页,所以我打开我的浏览器到http://localhost:9200 ,我什么都没有。

当我使用docker exec -it 3f1492790397 bash将“ssh”join到我的容器中时, 除了 /opt/bootup/logs目录(其中应该包含bootup.log文件)(在启动时创build)之外,是空的。

我尝试使用docker attach 3f1492790397 ,然后在浏览器中点击http://localhost:9200 ,查看是否会生成一些标准输出(我的应用程序将日志logging到/opt/bootup/logs/bootup.log以及控制台)但是不会产生任何输出。

所以我认为发生的事情是,我的应用程序(由于某种原因)没有权限创build自己的日志文件,当容器启动,并把应用程序在一个奇怪的状态,甚至阻止它完全启动。

所以我问:

  • 有没有办法看到什么用户我的应用程序启动? 要么
  • 在容器启动的时候有没有办法标准输出? 启动后附加不能帮助我,因为我认为当我运行docker attach命令应用程序已经窒息

提前致谢!

我不知道为什么你的应用程序不工作,但可以回答你的问题,

有没有办法看到什么用户我的应用程序启动? 要么

答:除非另有说明,否则Docker容器将以root身份运行。

在容器启动的时候有没有办法标准输出? 启动后附加不能帮助我,因为我认为当我运行泊坞窗附加命令应用程序已经窒息

答:默认情况下,Docker容器将stdout / stderr转储到Docker日志。 有两种方法可以看到这些:1是使用标志运行容器,而不是使用-d来获得交互式会话,该会话将列出容器中的stdout。 另一个是在运行或停止的容器上使用docker logs *container_name*命令。

docker附加3f1492790397

这不符合你的期望。 你想要的是docker exec (可能是docker exec -it bootup bash ),它会给你一个在容器范围内的shell,它会让你检查你的日志文件,或者尝试使用容器内部的curl命中应用程序。

为什么我没有输出?

很难说,没有从早先的命令的信息。 您的应用程序是在0.0.0.0还是在本地主机上进行侦听(您的笔记本电脑浏览器将看起来像一个外部的机器到容器)? 您的应用程序是否需要未运行的主pipe程序? 它是否需要一些其他JAR文件在您的笔记本电脑上的CLASSPATH,但不是在容器中? 你运行Docker使用Docker-Machine(在这种情况下localhost可能不是容器的名称)?