Docker 下运行 Emqx,数据卷挂载提示权限不足解决。

in 工作记录 with 0 comment

错误: mkdir: cannot create directory ‘/opt/emqx/data/configs’: Permission denied

错误: ERROR: emqx.conf is not found in /opt/emqx/etc

按照 EMQX 文档启动,默认是不带目录挂载的。

https://www.emqx.io/docs/en/v5.1/deploy/install-docker.html

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 版本需要挂载出来以下目录才能持久化:

但是启动加上 -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

image.png

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"
    }
]