错误: mkdir: cannot create directory ‘/opt/emqx/data/configs’: Permission denied
错误: ERROR: emqx.conf is not found in /opt/emqx/etc
按照 EMQX 文档启动,默认是不带目录挂载的。
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx:5.1.3
5.1.3 版本需要挂载出来以下目录才能持久化:
- /opt/emqx/data
- /opt/emqx/etc
- /opt/emqx/log
但是启动加上 -v 挂载后, 会报错:
mkdir: cannot create directory ‘/opt/emqx/data/configs’: Permission denied
原因很简单,EMQX 的镜像内 Linux 用户为 emqx,组为 emqx,并非 root 用户。
-v 创建目录时候默认用的一般是 root 用户,这时候 emqx 在 root 下的目录创建文件自然就权限不足。
这一点进入容器中可以看到。
sudo docker exec -it emqx /bin/bash
ls -l
EMQX 不使用 root 应该有他的原因,现在重点是怎么解决这个问题。
一种思路是宿主机也创建 emqx 这个用户,并且保持用户 id 和容器内部的一致,然后先创建好要挂载的目录,这样就可以跳过权限问题。
我觉得这个方法很麻烦,容器居然还要依赖环境...
我读了 Docker 的卷挂载相关的内容,发现匿名卷和具名卷可以兼容权限问题。
匿名卷可读性不好,建议创建具名卷。
创建一个具名卷
docker volume create emqx-data
启动加上 -v emqx-data:/opt/emqx/
sudo docker run -d --name emqx -v emqx-data:/opt/emqx/ -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:5.1.3
这里我偷了懒, 多挂载了几个文件夹出来,但是也无所谓吧,单机 Docker 启动 EMQX 一般都是用于测试...
补充:
查看具名卷:
sudo docker volume list
查看具名卷详情:
sudo docker volume inspect emqx-data
// 可以看到详细的目录。
[
{
"CreatedAt": "2023-07-31T06:01:13Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/emqx-data/_data",
"Name": "emqx-data",
"Options": null,
"Scope": "local"
}
]
本文由 考拉 创作,采用 知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Nov 16,2023