我花了整个周末倾听Docker文档并玩弄玩具应用程序和示例项目。我现在正在尝试编写一个我自己的超简单Web服务,并从容器内部运行它。在容器中,我想要我的应用程序(引擎盖下的Spring Boot应用程序) - 称为 bootup - 具有以下目录结构:
/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之外 - 一切都运行得很好,包括创建日志文件到主机的/opt/bootup/logs
目录。应用程序端点提供正确的内容等等。一切都很好,花花公子。
所以我创建了以下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
然后我通过以下方式构建我的图像:
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”进入我的容器时,我看到一切看起来都不错,除了 /opt/bootup/logs
目录,该目录应该有bootup.log
其中的文件 - 在启动时创建 - 是空的。
我尝试使用docker attach 3f1492790397
,然后在我的浏览器中点击http://localhost:9200
,看看是否会产生一些标准输出(我的应用程序同时记录到/opt/bootup/logs/bootup.log
以及控制台)但是这不会产生任何结果。
所以我认为正在发生的事情是我的应用程序(出于某种原因)在容器启动时无权创建自己的日志文件,并将应用程序置于奇怪的状态,甚至阻止它完全启动。
所以我问:
docker attach
命令时应用已经窒息提前致谢!
答案 0 :(得分:1)
我不知道为什么你的应用程序无法运行,但可以回答你的问题 -
有没有办法查看我的应用启动的用户是什么?或
答:除非另有说明,否则Docker容器以root身份运行。
有没有办法在容器启动时拖尾标准输出?启动后附加并没有帮助我,因为我认为当我运行docker attach命令时,应用程序已经窒息
答:Docker容器默认将stdout / stderr转储到Docker日志。有两种方法可以看到这些 - 1是使用标志-it而不是-d运行容器,以获得将列出容器中的标准输出的交互式会话。另一种是在正在运行或已停止的容器上使用docker logs *container_name*
命令。
docker attach 3f1492790397
这并不是你所希望的。你想要的是docker exec
(可能是docker exec -it bootup bash
),它将在容器范围内为你提供一个shell,它可以让你检查你的日志文件,或者尝试使用curl从里面找到你的应用程序。容器
为什么我没有输出?
很难说没有早期命令的信息。您的应用是在0.0.0.0还是在localhost上监听(您的笔记本电脑浏览器看起来像是容器的外部机器)?您的应用是否需要一个不运行的主管流程?它是否需要笔记本电脑上CLASSPATH上的其他JAR文件而不是容器中的其他JAR文件?你是否正在使用Docker-Machine运行docker(在这种情况下localhost
可能不是容器的名称)?