Как запустить два сервиса в одном docker контейнере - PullRequest
0 голосов
/ 01 мая 2020

Мне нужно запустить две службы / команды в docker, от Google я понял, что могу использовать ENTRYPOINT и CMD для передачи разных команд. но когда я запускаю контейнер, запускается только скрипт ENTRYPOINT, а CMD кажется не работает. Поскольку я новичок docker, можете ли вы помочь мне выполнить две команды.

Dockerfile:

FROM registry.suse.com/suse/sle15

ADD repolist/*.repo /etc/zypp/repos.d/

RUN zypper refs && zypper refresh

RUN zypper in -y bind

COPY docker-entrypoint.d/* /docker-entrypoint.d/

COPY --chown=named:named named /var/lib/named

COPY --chown=named:named named.conf /etc/named.conf

COPY --chown=named:named forwarders.conf /etc/named.d/forwarders.conf

ENTRYPOINT [ "./docker-entrypoint.d/startbind.sh" ]

CMD ["/usr/sbin/named","-g","-t","/var/lib/named","-u","named"]

startbind. sh:

#! /bin/bash

/usr/sbin/named.init start

Спасибо и С уважением, Мохамед Навин

Ответы [ 4 ]

0 голосов
/ 02 мая 2020

Опции для запуска более одного сервиса в контейнере очень хорошо описаны в этой официальной docker статье: multi-service_container . Я бы порекомендовал проанализировать, почему вам нужны две службы в одном контейнере (общий объем данных, init и т. Д. c), правильно разделив службы, которые вы будете готовы масштабировать архитектуру, более полезные журналы, более простое управление жизненным циклом / ресурсами, и более легкое тестирование.

0 голосов
/ 01 мая 2020

Вы можете добавить в startbind. sh запуск двух сервисов. Вы также можете использовать команду RUN. Выполнить команды в контейнере docker. Если не работает, вы можете попросить меня продолжать помогать вам.

0 голосов
/ 02 мая 2020

Вы можете использовать supervisor инструменты для управления несколькими службами внутри одного docker контейнера.

Посмотрите на приведенный ниже пример (работает Redis и сервер Django с использованием одного CMD):

Dockerfile:

# Base Image
FROM alpine

# Installing required tools
RUN apk --update add nano supervisor python3 redis

# Adding Django Source code to container 
ADD /django_app /src/django_app

# Adding supervisor configuration file to container
ADD /supervisor /src/supervisor

# Installing required python modules for app
RUN pip3 install -r /src/django_app/requirements.txt

# Exposing container port for binding with host
EXPOSE 8000

# Using Django app directory as home
WORKDIR /src/django_app

# Initializing Redis server and Gunicorn server from supervisors
CMD ["supervisord","-c","/src/supervisor/service_script.conf"]

файл service_script.conf

## service_script.conf

[supervisord]  ## This is the main process for the Supervisor    
nodaemon=true  ## This setting is to specify that we are not running in daemon mode

[program:redis_script] ## This is the part where we give the name and add config for our 1st service
command=redis-server  ## This is the main command to run our 1st service
autorestart=true ## This setting specifies that the supervisor will restart the service in case of failure
stderr_logfile=/dev/stdout ## This setting specifies that the supervisor will log the errors in the standard output
stderr_logfile_maxbytes = 0
stdout_logfile=/dev/stdout ## This setting specifies that the supervisor will log the output in the standard output
stdout_logfile_maxbytes = 0

## same setting for 2nd service
[program:django_service] 
command=gunicorn --bind 0.0.0.0:8000 django_app.wsgi
autostart=true
autorestart=true
stderr_logfile=/dev/stdout
stderr_logfile_maxbytes = 0
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes = 0

Конечный результат: Служба Redis и Gunicorn в одном и том же docker контейнере

Вы можете прочитать мою полную статью по этому вопросу, ссылка приведена ниже: Ссылка для завершения статья

0 голосов
/ 01 мая 2020

В пределах startbind.sh вы можете сделать:

#! /bin/bash

#start second servvice here, and push it to background:
/usr/sbin/secondesrvice.init start &

#then run the last commands:
/usr/sbin/named.init start

ваша /usr/sbin/named.init start (последняя команда на точке входа) команда НЕ должна go в фоновом режиме, вам нужно держать ее на переднем плане .

Если эта последняя команда не сохраняется на переднем плане, Docker завершится.

...