1、出现问题
新项目采用springboot2.3之后的自带打包方式打包成功后,启动发现目录文件里面没有日志生成
logs
文件路径下没有日志生成。
docker-compose.yaml
目录挂载如下:
version: "3"
services:
dedupe:
image: XXX
container_name: dedupe
environment:
- TZ=Asia/Shanghai
- LANG=zh_CN.UTF-8
- JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8
ports:
- 8082:8082
volumes:
- ./config:/workspace/config
- ./logs:/workspace/logs
restart: always
日志相关配置
logging:
file:
name: logs/application.log
level:
com.gildata: INFO
logback:
rollingpolicy:
max-file-size: 100MB
max-history: 10
2、发现问题
检查外部所有配置文件没有问题之后,进入容器内部查看日志文件是否生成
docker exec -it 容器id /bin/bash
查看对应容器内部日志文件生成路径是是否存在日志文件
drwxr-xr-x. 1 cnb cnb 32 Feb 3 13:22 ./
drwxr-xr-x. 1 root root 48 Feb 3 13:22 ../
drwxr-xr-x. 1 cnb cnb 60 Jan 1 1980 BOOT-INF/
drwxr-xr-x. 3 cnb cnb 80 Jan 1 1980 META-INF/
drwxr-xr-x. 2 root root 35 Feb 3 13:22 config/
drwxr-xr-x. 2 root root 29 Feb 3 13:22 logs/
drwxr-xr-x. 3 cnb cnb 29 Jan 1 1980 org/
发现logs 下面确实没有日志文件生成,但是config下面的配置文件是外部成功的映射进来了。
同时发现,config 和logs 2个路径的用户都是root,而其他的辣眼睛都是 cnb
用户。初步怀疑是路径权限问题,导致日志没有写进去,但是config由于是读操作,所以没有问题。
3、解决问题
更改映射的2个路径的权限,重新生成启动容器
chown -R 1000:1000 config/
chown -R 1000:1000 logs/
发现日志可以正常生成,宿主机中也出现了日志。同时容器内部的权限正常
drwxr-xr-x. 1 cnb cnb 32 Feb 3 13:22 ./
drwxr-xr-x. 1 root root 48 Feb 3 13:22 ../
drwxr-xr-x. 1 cnb cnb 60 Jan 1 1980 BOOT-INF/
drwxr-xr-x. 3 cnb cnb 80 Jan 1 1980 META-INF/
drwxr-xr-x. 2 cnb cnb 35 Feb 3 13:22 config/
drwxr-xr-x. 2 cnb cnb 29 Feb 3 13:22 logs/
drwxr-xr-x. 3 cnb cnb 29 Jan 1 1980 org/
4、问题原因
错误的原因是,docker-compose启动的时候会分别在容器和宿主机上创建目录,在宿主机上是使用docker进程来创建目录的,默认使用的角色是root,目录挂载的时候会把这个用户同步到容器里面的目录,所以容器里面logs目录权限也是root,但是容器里面的应用是使用cnb用户来运行的,当然没有往logs目录里面写的权限,所以就报错了;因为这两个角色是会同步的,所以解决的办法就是修改宿主机的日志权限为docker里面用户的权限;可以使用如下命令修改宿主机日志目录的权限:
chown -R 1000:1000 对应路径
当然这是一个快速的解决方案,一劳永逸的话,可以在打包的时候权限相关的操作,使用root用户将容器中的logs目录赋权限为cnb