从Docker容器登录到主机不起作用

时间:2019-01-22 07:53:41

标签: docker docker-compose

我有一个基于微服务的应用程序,如果将它们部署在主机上,这些服务将可以正常工作。但是现在,我想学习Docker,因此我开始在基于Linux的计算机上使用容器。这是一个示例Docker文件,它非常简单:

  FROM openjdk:11-jdk-slim
  MAINTAINER BeszterceKK
  COPY ./tao-elszamolas-config.jar /usr/src/taoelszamolas/tao-elszamolas-config.jar
  WORKDIR /usr/src/taoelszamolas
  ENV SPRING_PROFILES_ACTIVE prod
  EXPOSE 9001
  ENTRYPOINT ["java", "-jar", "tao-elszamolas-config.jar", "-Dlog4j.configurationFile=file:/tao-elszamolas/services/tao-config/log4j2-    prod.xml", "-DlogFileLocation=/tao-elszamolas/logs"]

我的问题是,我尝试将Spring Boot应用程序日志写入主机。这就是为什么我使用数据量。最后,这是我如何运行容器的命令:

docker run -d --name=tao-elszamolas-config-server --publish=9001:9001 -v /tao-elszamolas/logs:/tao-elszamolas/logs -v /tao-elszamolas/services/tao-config/log4j2-prod.xml:/tao-elszamolas/services/tao-config/log4j2-prod.xml tao-elszamolas-config:latest

但是从长远来看,所有服务都将在“ docker-compose”下进行。这只是为了测试,有点像概念证明。

第一个问题是,为什么它没有将日志写入正确的位置。 (在已定义的卷之一中。)这就是我在Log4j2配置xml中设置的内容。如果我在没有Docker的本地环境中使用config XML,则一切正常。当我登录到容器时,可以看到已安装的卷,并且可以将其“ cd”到其中。我也可以这样做:

touch something.txt

因此将创建文件,并且可以从容器和主机上看到该文件。我究竟做错了什么?我认为,该应用程序可以选择日志配置,因为当我仅将内部文件夹设置为日志文件的位置时,它将把内容记录在容器内。

我还临时将整个卷(及其子级)的权限设置为777,以测试权限是否出了问题。但不是。任何帮助将不胜感激!

我的第二个问题是,在Linux上是否有任何基于Web的好的工具可以用来管理容器。启动它们,然后停止,等等。。。我用谷歌搜索出来,但发现有些不确定,哪一种是最基本的免费的,并且满足基本需求。

3 个答案:

答案 0 :(得分:1)

仅提供一些验证步骤:

一般来说,Log4j和spring boot都不应该知道任何与docker相关的东西,例如卷,映射的文件夹等。

相反,将应用程序的日志记录配置为完全不需要docker即可运行,因此,如果要本地文件,请确保该应用程序确实在您选择的文件夹中生成了日志文件。

下一步将使用docker / docker-docker中的卷映射文件夹。 但首先请验证第一步:

docker ps // to see the container id
docker exec -it <CONTAINER_ID> bash
// now check the logging file from within the docker container itself even without volumes

如果日志文件不存在,则为Java问题,您应正确配置日志。如果不是,那是docker问题。

答案 1 :(得分:1)

更新:

花了几个晚上后设法解决了这个问题。

我有多个问题。首先,Dockerfile ENTRYPOINT部分中的系统属性顺序不太正确。

-Dsomething=something

必须在“ -jar”之前。否则它将无法在Docker中运行。我没有找到任何官方文件说明这一点,但这就是它对我有用的方式。因此正确的ENDPOINT定义如下所示:

ENTRYPOINT ["java", "-DlogFileLocation=/tao-elszamolas/logs", "-jar", "tao-elszamolas-config.jar"]

其次,当我使用docker run命令将一些文件夹安装到容器上时,

-v /tao-elszamolas/logs:/tao-elszamolas/logs

然后,如果默认情况下Docker容器中的文件夹不存在,则不写入日志文件。但是,如果我在Dockerfile中的ENTRYPOINT之前的某个时间创建了该文件夹,则日志记录很好,系统会将其日志写入主机。我也没有找到任何说明这些事实的文档,但这是我的经验。

答案 2 :(得分:0)

在入口点中,log4j2-之后和prod.xml之前有一个空格:

ENTRYPOINT ["java", "-jar", "tao-elszamolas-config.jar", "-Dlog4j.configurationFile=file:/tao-elszamolas/services/tao-config/log4j2-    prod.xml", "-DlogFileLocation=/tao-elszamolas/logs"]

可能是个问题。

相关问题