запустить несколько команд при запуске Docker-контейнера - PullRequest
0 голосов
/ 06 октября 2018

У меня есть простой образ докера, работающий в Ubuntu 16.04 на основе файла Docker, CMD которого равен "/sbin/ejabberdctl foreground".чтобы сохранить контейнер докера после его запуска, я использовал сервер ejabberd на переднем плане.Однако после запуска контейнера и /sbin/ejabberdctl мне нужно выполнить еще одну команду, когда ejabberdctl уже запущен (например, ejabberdctl list_cluster).Попытался добавить обе команды в скрипт bash, но это не работает.попытался запустить /sbin/ejbberdctl start &, тоже не получилось.Какой способ копать?

Ответы [ 3 ]

0 голосов
/ 06 октября 2018

То, что вы ищете, называется supervisord официальной документации докера вы можете найти некоторые примеры того, как его использовать.

Имейте в виду, что запуск нескольких служб в одном контейнере не рекомендуется, если в этом нет особой необходимости.

0 голосов
/ 07 октября 2018

Опция A: Создать простой сценарий bash, который запускает контейнер и list_cluster без изменения точки входа образа докера ejabberd.

#!/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

Я предложу использовать официальный альпийский образ 30 МБ только ejabberd вместо Ubuntu,https://hub.docker.com/r/ejabberd/ecs/

Демонстрацию здесь можно изменить и для Ubuntu, но это проверено на официальном изображении Alpine Ejabberd.

Используйте официальное изображение ejabberd в качестве base image и 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 , чтобы запустить ejabberd, используя supervisorsd .Обратите внимание, что аргумент 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-скрипт, который будет list_cluster после запуска ejabberd и также способен 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

0 голосов
/ 06 октября 2018

Докер предназначен для запуска только одной команды за раз.Есть способ обойти это ограничение, но по умолчанию используется один контейнер = одна команда.Возможно, вы захотите взглянуть на другие контейнерные инфраструктуры, которые разработаны по-разному и допускают одновременное выполнение нескольких команд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...