在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
可能不是容器的名称)?