docker-记录一次docker-compose部署容器挂载权限问题

embedded/2024/11/14 12:51:19/

一、背景

需要在单独的docker环境部署一套应用程序,包括mqtt,数据库,应用等

二、问题

部署mqtt服务使用的是emqx服务。
下面是部分docker-compose.yml的内容

  emqx:container_name: minqing_emqximage: xxx.xxx.cn/minqing/emqx/emqxports:- "18083:18083"- "1884:1883"- "8883:8883"  # 可选,安全连接- "8083:8083"- "8084:8084"volumes:- /docker-container-data/emqx5.7.1/fujian-compose/data:/opt/emqx/data- /docker-container-data/emqx5.7.1/fujian-compose/log:/opt/emqx/log

无法创建/opt/emqx/data/configs文件夹,这个文件夹是emqx容器内的

docker run  --name emqx -p 18083:18083 -p 1884:1883 -p 8883:8883 -p 8083:8084 -v /root/docker-wrl/docker-container-data/emqx571/fujian/data:/opt/emqx/data -v /root/docker-wrl/docker-container-data/emqx571/fujian/log:/opt/emqx/log xxx.xxx.cn/minqing/emqx/emqx
mkdir: cannot create directory ‘/opt/emqx/data/configs’: Permission denied

三、分析

  1. 通常意味着运行 Docker 容器内的用户没有足够的权限来在指定的路径下创建目录。
  2. 之后我尝试不要挂载运行容器,结果是可以成功运行的。所以问题可能出在挂载的操作

关键:

  1. 宿主机
  • 在挂载的时候 -v /root/docker-wrl/docker-container-data/emqx571/fujian/data:/opt/emqx/data,如果宿主机上的这个目录/root/docker-wrl/docker-container-data/emqx571/fujian/data不完整,会被自动创建。它的创建是docker。如果父目录存在,而子目录不存在,Docker 会创建子目录;如果父目录也不存在,则会报错,因为 Docker 不能创建嵌套的目录结构。
  • 挂载目录时,通常是由 Docker 守护进程(Docker daemon)创建的。具体来说:
    Docker Daemon:当您运行 docker run 命令并指定一个不存在的宿主机路径时,Docker Daemon 会自动尝试创建该路径。
    用户权限:创建目录的权限取决于运行 Docker Daemon 的用户。通常在 Linux 系统中,Docker Daemon 以 root 用户身份运行,因此它有权限在愿意的目录下创建新目录。
  • 所以,可以发现,即使容器没有运行成功,但是宿主机上的路径是被创建的了,因为是root身份创建的,所以一般它的权限是drwxr-xr-x 2 root root 4096 Sep 2 06:21 datadrwxr-xr-x 2 root root 4096 Sep 2 06:21 log
  1. 容器

我在不挂载的情况下,进到容器内,看见的的log和data的权限如下:

drwxr-xr-x 2 emqx emqx 4096 Jun 26 13:39 bin
drwxr-xr-x 7 emqx emqx 4096 Sep  2 06:46 data
drwxr-xr-x 2 emqx emqx 4096 Jun 26 13:39 dynlibs
drwxr-xr-x 3 emqx emqx 4096 Jun 26 13:39 erts-14.2.5
drwxr-xr-x 5 emqx emqx 4096 Jun 26 13:39 etc
drwxr-xr-x 1 emqx emqx 4096 Jun 26 13:39 lib
drwxr-xr-x 2 emqx emqx 4096 Jun 26 13:39 log
drwxr-xr-x 2 emqx emqx 4096 Jun 26 13:39 plugins
drwxr-xr-x 3 emqx emqx 4096 Jun 26 13:39 releases

容器内部对log和data使用的是emqx用户,它对宿主机对应的两个路径是没有写权限的,只有root才有写权限。

在挂载时,容器内的指定路径下的数据写入宿主机指定路径的操作由容器内的进程执行
容器内的进程:当您启动容器并挂载一个宿主机目录时,容器内运行的应用程序会使用其权限将数据写入到挂载的宿主机路径。

用户权限:写入操作的权限取决于容器内进程的用户。例如:

  • 如果应用程序以 root 用户身份运行,它将拥有在宿主机路径上写入的权限。
  • 如果应用程序以非特权用户运行,则该用户必须在宿主机上具有相应目录的写入权限。

四、解决

那就是改变文件夹权限或者更换用户来操作。

sudo chmod -R 777 /root/docker-wrl/docker-container-data/emqx571/fujian/data
sudo chmod -R 777 /root/docker-wrl/docker-container-data/emqx571/fujian/log

注意要一块改,如果不改log的,容器也可以运行,那是因为一开始容器本来就没有往里面写内容,所以不会报错,但是之后肯定会出现异常。


http://www.ppmy.cn/embedded/107178.html

相关文章

Kafka-代码模板

配置:server.properties绑定Kafka服务器生产者配置生产者发送消息消费配置消费者接收消息消费提交springboot 集成 ack‐mode生产者 & 消费者 Kafka事务 配置:server.properties 配置:server.properties #broker.id属性在kafka集群中必…

核心交换机的六个基础知识

首先你要明确一个概念,接入层交换机、汇聚层交换机、核心层交换机并非是交换机的种类或者属性,只是由其所执行的任务来划分的。 从网络拓扑结构来讲,一个计算机网络系统结构需采用三层网络架构:接入层、汇聚层、核心层。 核心层是…

Redis: 用于纯缓存模式需要注意的地方

这里写自定义目录标题 一、核心原理二、配置展示三、问题注意 一、核心原理 在某些场景下,我们只使用的是热点缓存数据,不需要数据的备份与恢复。纯缓存模式-禁用rdb持久化-禁用aof持久化。 二、配置展示 sava “” # 禁用rdb appendonly on # 禁用ao…

【Linux】在 bash shell 环境下,当一命令正在执行时,按下 control-Z 会?

目录 题目分析答案 题目 分析 ctrl-c: 发送 SIGINT 信号给前台进程组中的所有进程。常用于终止正在运行的程序;ctrl-z: 发送 SIGTSTP信号给前台进程组中的所有进程,常用于挂起一个进程;ctrl-d: 不是发送信…

Codeforces Round 969 (Div. 2) ABCD

A题:Doras Set 思路 贪心地想,如果可以的话,我们直接全用连续的3个,这样就能实现最多 但是给出的样例 1 1000 250 说明了有连续的三个不符合的情况 先考虑连续两个的情况,是一定符合gcd(x, x1)1的 因为x1-x1 &am…

力扣860-柠檬水找零(java详细题解)

题目链接:860. 柠檬水找零 - 力扣(LeetCode) 前情提要: 因为本人最近都来刷贪心类的题目所以该题就默认用贪心方法来做。 贪心方法:局部最优推出全局最优。 如果一个题你觉得可以用局部最优推出全局最优&#xff0…

C语言典型例题57

《C程序设计教程(第四版)——谭浩强》 例题4.9 判断整数是否为素数 代码: //《C程序设计教程(第四版)——谭浩强》 //例题4.9 判断整数是否为素数//【数学知识】素数:一个大于1的自然数,如果只…

Linux-vi编辑命令的常用用法

一、Linux系统vi编辑命令简单介绍‌ vi‌是Linux系统中一个非常流行的文本编辑器,它提供了强大的编辑功能,尤其是在命令行模式下,可以进行各种文本操作。 二、vi编辑模式介绍 ‌命令模式‌:默认模式,可以进行光标移…