我有一个基于微服务的应用程序,如果将它们部署在主机上,这些服务将可以正常工作。但是现在,我想学习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的好的工具可以用来管理容器。启动它们,然后停止,等等。。。我用谷歌搜索出来,但发现有些不确定,哪一种是最基本的免费的,并且满足基本需求。
答案 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"]
可能是个问题。