选项A:
创建一个简单的bash脚本,运行容器并列出ejabberd docker镜像的集群列表,而不修改入口点。
#!/bin/bash
if [ "${1}" = "remove_old" ]; then
echo "removing old ejabberd container"
docker rm -f ejabberd
fi
docker run --rm --name ejabberd -d -p 5222:5222 ejabberd/ecs
sleep 5
echo -e "*******list_cluster******"
docker exec -it ejabberd ash -c "/home/ejabberd/bin/ejabberdctl list_cluster"
选项B
在选项B中,您需要修改ejabberd官方镜像的入口点,因为它不允许您在启动时运行多个脚本。所以在启动时添加您的脚本,同时进行一些修改。
https://github.com/processone/docker-ejabberd/blob/master/ecs/Dockerfile
我会建议使用官方的alpine ejabberd镜像,它仅有30MB,而不是Ubuntu。
https://hub.docker.com/r/ejabberd/ecs/
这里的演示也可以修改成Ubuntu版本,但这是针对官方的alpine ejabberd镜像进行测试的。
使用ejabberd官方镜像作为基础镜像,ENV MASTER_NODE=ejabberd@ec2-10.0.0.1
是用于主节点(如果您想要一个集群)。
From ejabberd/ecs:latest
USER root
RUN whoami
COPY supervisord.conf /etc/supervisord.conf
RUN apk add supervisor
RUN mkdir -p /etc/supervisord.d
COPY pm2.conf /etc/supervisord.d/ejabberd.conf
COPY start.sh /opt/ejabberd/start.sh
RUN chmod +x /opt/ejabberd/start.sh
ENV MASTER_NODE=ejabberd@ec2-10.0.0.1
ENTRYPOINT ["supervisord", "--nodaemon", "--configuration", "/etc/supervisord.conf"]
现在创建
管理者配置文件。
[unix_http_server]
file = /tmp/supervisor.sock
chmod = 0777
chown= nobody:nogroup
[supervisord]
logfile = /tmp/supervisord.log
logfile_maxbytes = 50MB
logfile_backups=10
loglevel = info
pidfile = /tmp/supervisord.pid
nodaemon = true
umask = 022
identifier = supervisor
[supervisorctl]
serverurl = unix:///tmp/supervisor.sock
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[include]
files = /etc/supervisord.d/*.conf
现在创建
ejabberd.conf 文件以使用
supervisorsd 启动 ejabberd。请注意,此处使用了 join cluster 参数以加入集群(如果需要)。如果不需要加入集群,请将其删除。
[supervisord]
nodaemon=true
[program:list_cluster]
command: /opt/ejabberd/start.sh join_cluster
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
[program:ejabberd]
command=/home/ejabberd/bin/ejabberdctl foreground
autostart=true
priority=1
autorestart=true
username=ejabberd
exitcodes=0 , 4
一个
/opt/ejabberd/start.sh
的 bash 脚本,当 ejabberd 启动后将会执行
list_cluster 命令,并且如果在调用脚本时传入参数,则可以执行
join_cluster 命令。
#!/bin/sh
until nc -vzw 2 localhost 5222; do sleep 2 ;echo -e "Ejabberd is booting....."; done
if [ $? -eq 0 ]; then
echo -e "***************List_Cluster start***********"
/home/ejabberd/bin/ejabberdctl list_cluster
echo -e "***************List_Cluster End***********"
if [ "${1}" == "join_cluster" ]; then
echo -e "***************Joining_Cluster start***********"
/home/ejabberd/bin/ejabberdctl join_cluster ejabberd@$MASTER_NODE
echo -e "***************Joining_Cluster End***********"
fi
else
echo -e "**********Ejabberd is down************";
fi
运行Docker容器
docker build -t ejabberd .
docker run --name ejabberd --rm -it ejabberd
![enter image description here](https://istack.dev59.com/RFzzd.webp)