gpt4 book ai didi

docker - 在 docker container start 中运行多个命令

转载 作者:行者123 更新时间:2023-12-02 18:37:45 24 4
gpt4 key购买 nike

我有一个基于 dockerfile 的 ubuntu 16.04 上运行的简单 docker 镜像,CMD 是 "/sbin/ejabberdctl foreground"。为了让 docker 容器在启动后保持事件状态,我曾经在前台运行 ejabberd 服务器。然而,在启动容器和 /sbin/ejabberdctl 之后,我需要在 ejabberdctl 已经运行后执行另一个命令(例如 ejabberdctl list_cluster)。试图将这两个命令添加到 bash 脚本,但它不起作用。尝试运行 /sbin/ejbberdctl start &,它也没有用。往哪个方向挖?

最佳答案

选项 A:创建一个运行容器和 list_cluster 的简单 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"

enter image description here选项B

在选项 B 中,您需要修改 ejabberd 官方图像入口点,因为它不允许您在启动时运行多个脚本。所以在启动时添加你的脚本,同时进行一些修改。

https://github.com/processone/docker-ejabberd/blob/master/ecs/Dockerfile

我建议使用 ejabberd 的 仅 30 MB 的官方 alpine 镜像,而不是 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

########## Once ejabberd is up then list the cluster ##########
echo -e "***************List_Cluster start***********"
/home/ejabberd/bin/ejabberdctl list_cluster
echo -e "***************List_Cluster End***********"
########## If you want to join cluster once up as pass the master node as ENV then pass first param like join_cluster ##########
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

关于docker - 在 docker container start 中运行多个命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52673602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com