docker容器挂载权限问题 导致日志文件不生成

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: 当使用docker进入容器后,挂载文件可能会出现无权限的情况。这是因为默认情况下,docker容器是不允许挂载文件系统的。为了解决这个问题,可以使用nsenter工具来操作容器。通过nsenter,我们可以在docker容器中执行任意的命令,获取root权限,而不受到安全限制的干扰。这样就可以解决挂载文件权限问题。\[1\] 另外,当在容器内部创建或修改文件时,可能会提示没有权限的错误。这是因为容器内部的文件系统权限限制。为了解决这个问题,可以在运行容器时使用docker命令的-v参数,允许容器文件与宿主机之间进行双向映射。这样可以修改文件时不需要进入容器内部,直接在宿主机上进行修改。同时,这也可以实现数据的持久化,避免容器删除后数据丢失的情况。以Nginx为例,可以使用-v参数来进行文件映射。\[2\]\[3\] #### 引用[.reference_title] - *1* [Docker应用教程-挂载运行中的docker容器挂载文件系统](https://blog.csdn.net/weixin_36473855/article/details/112015325)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [docker挂载目录,容器无操纵权限](https://blog.csdn.net/weixin_42181179/article/details/128650146)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [一起学DockerDocker容器文件挂载方法一](https://blog.csdn.net/ren365880/article/details/123858745)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值