官方的要求的docker安装emqx,配置了数据卷之后 docker无法启动

官方的指令:

#原生的
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:5.1.3

我自己增加了数据卷的配置:
docker run -d
-p 1883:1883
-p 8083:8083
-p 8084:8084
-p 8883:8883
-p 18083:18083
–name emqx
-v $PWD/data:/opt/emqx/data
-v $PWD/etc:/opt/emqx/etc
-v $PWD/log:/opt/emqx/log
emqx/emqx:5.1.3
增加了数据卷配置之后 docker无法启动

docker logs [container_name] 这个命令看一下容器的启动日志

这个尝试过了
[root@iZ2ze9zpq93msg486riflbZ emqx_docker_data]# docker logs emqx
ERROR: emqx.conf is not found in /opt/emqx/etc
当执行logs日志的时候 报没有找到/opt/emqx/etc 这个问题 已经很多水友遇到了。是容器问题 还是emqx兼容容器的数据卷问题呢,因为只有配置了数据卷之后 就会出现这个问题。

我猜想 可能是配置数据卷后 不支持 然后 emqx安装的时候就异常退出了,导致最终的容器中emqx就没有安装完整。 docker logs 找不到 日志。 端口映射好像也是失败的。群里有很多人遇到这个问题,除非忽略这个数据卷配置,但是生产环境 不配置数据卷有点吓人。

又经过大量的测试,问题就是在于配置数据卷的命令,导致容器无法启动,不知道容器中什么原因导致了,容器内部的data、etc等相关目录丢失,最终无论是docker start 还是docker log 都无法使用。

可以帮忙执行一下配置数据卷的docker命令吗,你们看下问题
docker run -d
-p 1883:1883
-p 8083:8083
-p 8084:8084
-p 8883:8883
-p 18083:18083
–name emqx
-v $PWD/data:/opt/emqx/data
-v $PWD/etc:/opt/emqx/etc
-v $PWD/log:/opt/emqx/log
emqx/emqx:5.1.3

挂载了数据卷就意味着用外部目录替换容器内默认的 etc data log 目录
此时需要手动准备 etc 目录下的:配置文件,证书,erlang 虚拟机参数配置等文件

root@969b3598514d:/opt/emqx# tree etc
etc
├── acl.conf
├── certs
│   ├── README
│   ├── cacert.pem
│   ├── cert.pem
│   ├── client-cert.pem
│   ├── client-key.pem
│   └── key.pem
├── emqx.conf
├── examples
│   ├── README.md
│   ├── alarm.conf.example
│   ├── cluster-with-dns.conf.example
│   ├── cluster-with-etcd-ssl.conf.example
│   ├── cluster-with-etcd.conf.example
│   ├── cluster-with-k8s.conf.example
│   ├── cluster-with-manual.conf.example
│   ├── cluster-with-static.conf.example
│   ├── conn_congestion.conf.example
│   ├── dashboard-with-http.conf.example
│   ├── dashboard-with-https.conf.example
│   ├── delayed.conf.example
│   ├── exhook.conf.example
│   ├── flapping_detect.conf.example
│   ├── force_gc.conf.example
│   ├── force_shutdown.conf.example
│   ├── gateway.coap.conf.example
│   ├── gateway.exproto.conf.example
│   ├── gateway.lwm2m.conf.example
│   ├── gateway.mqttsn.conf.example
│   ├── gateway.stomp.conf.example
│   ├── listeners.quic.conf.example
│   ├── listeners.ssl.conf.example
│   ├── listeners.tcp.conf.example
│   ├── listeners.ws.conf.example
│   ├── listeners.wss.conf.example
│   ├── log.console.conf.example
│   ├── log.file.conf.example
│   ├── mqtt.conf.example
│   ├── node.conf.example
│   ├── plugins.conf.example
│   ├── prometheus-pushgateway.conf.example
│   ├── prometheus.conf.example
│   ├── psk_authentication.conf.example
│   ├── retainer.conf.example
│   ├── sys_topics.conf.example
│   ├── sysmon.os.conf.example
│   └── sysmon.vm.conf.example
├── lwm2m_xml
│   ├── LWM2M_Access_Control-v1_0_1.xml
│   ├── LWM2M_Connectivity_Statistics-v1_0_1.xml
│   ├── LWM2M_Device-v1_0_1.xml
│   ├── LWM2M_Firmware_Update-v1_0_1.xml
│   ├── LWM2M_Location-v1_0.xml
│   ├── LWM2M_Security-v1_0.xml
│   └── LWM2M_Server-v1_0.xml
├── ssl_dist.conf
└── vm.args

3 directories, 55 files
root@969b3598514d:/opt/emqx# 

etc 目录下的:配置文件,证书,erlang 虚拟机参数配置等文件.。手动怎么配置呀, :scream:,我今天没有配置数据卷装了一个emqx ,然后把etc目录复制出来一份,然后再重新装了一个新的配置数据卷,到我刚刚复制目录里面,当然etc里面内容什么也没动,docker emqx启动就闪退 然后一直启动不了,是要改配置吗,按照道理来说 配置数据卷 只是为了文件保留 方便配置呀,不配置也可以呀。为啥要还得手动准备 …

如果只有这手动准备方式,这么多要配置的 我将从哪里开始…

etc 目录下的配置文件,包含了 emqx 集群/节点/虚拟机参数等许多配置
配了空的目录就会因为找不到配置文件而无法启动。

简单的配置修改可以通过给容器传环境变量的方式进行,不一定要挂载数据卷进去,参考:通过环境变量设置配置


遇到这个问题的人有点多哎~~~ 存在可能完善的情况吗

配置数据卷不是为了docker出现意外 能够保留 日志 数据等各项配置么,正常情况下不会是空目录呀,docker中都有 同步到数据卷就好了呀。

是的,但是你挂进去的数据卷是空的: -v $PWD/etc:/opt/emqx/etc
EMQX 需要挂进去的目录里有准备好的配置文件才能正常启动与

如果我期望仍然以这种数据卷的方式应该怎么做呢,我自己启动一个容器 直接把etc目录内容复制一份,然后删除 重新启动一个容器 挂载到这里。


仍然是不可以

EMQX 的启动要求配置文件必须存在,在这里即 /opt/emqx/etc/emqx.conf。所以你挂载的目录需要提供这个文件才行,不能是空文件夹。

我自己启动一个容器 直接把etc目录内容复制一份,然后删除 重新启动一个容器 挂载到这里。

emqx.conf 是 emqx 启动必须依赖的配置文件,所以就算是启动过,再次启动时仍然是需要的

这个问题等于没解决

@wivwiv 我们应该在文档里新增一个章节,来描述简单引导 “通过 Docker 启动 EMQX 如何持久化” 一些数据或者配置

非常值得推荐,在经过你们合格的测试后,将步骤放入到文档中,因为docker部署是很常见的,生产环境,公司一定会要求配置持久化。如果有个细则说明,就好了。非常感谢你能够向你的团队提出建议 :heart: