我的应用程序在Docker

时间:2017-06-12 19:43:36

标签: docker file-permissions

我花了整个周末倾听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命令时应用已经窒息

提前致谢!

1 个答案:

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