Запуск нескольких сервисов с использованием сценария оболочки в Dockerfile - PullRequest
0 голосов
/ 10 апреля 2019

Я создаю Dockerfile для установки и запуска служб WebLogic 12c, используя сценарии запуска при команде «docker run».Я передаю сценарий оболочки в инструкции CMD, которая выполняет сценарии startWeblogic.sh и startNodeManager.sh.Но когда я вошел в контейнер, он запустил только первый скрипт startWeblogic.sh и даже не запустил второй скрипт, что очевидно из журналов докера.

Тот же скрипт выполняется внутри контейнера вручную и запускает обе службы.Какова правильная инструкция для запуска сценария для запуска нескольких процессов в контейнере, а не для выхода из контейнера?

Чего мне не хватает в этом сценарии и в файле Docker?Я знаю, что контейнер может запускать только один процесс, но по-грязному, как запустить несколько служб для приложения, такого как WebLogic, которое имеет сервер имен, менеджер узлов, управляемый сервер и создание управляемых доменов и машин.Управляемый сервер может быть запущен только во время работы сервера имен WebLogic.

Скрипт: startcript.sh

#!/bin/bash

# Start the first process
/u01/app/oracle/product/wls122100/domains/verdomain/bin/startWebLogic.sh -D
status=$?
if [ $status -ne 0 ]; then
  echo "Failed to start my_first_process: $status"
  exit $status
fi

# Start the second process
/u01/app/oracle/product/wls122100/domains/verdomain/bin/startNodeManager.sh -D
status=$?
if [ $status -ne 0 ]; then
  echo "Failed to start my_second_process: $status"
  exit $status
fi

while sleep 60; do
  ps aux |grep "Name=adminserver" |grep -q -v grep
  PROCESS_1_STATUS=$?
  ps aux |grep node |grep -q -v grep
  PROCESS_2_STATUS=$?
  # If the greps above find anything, they exit with 0 status
  # If they are not both 0, then something is wrong
  if [ $PROCESS_1_STATUS -ne 0 -o $PROCESS_2_STATUS -ne 0 ]; then
    echo "One of the processes has already exited."
    exit 1
  fi
done

Усеченный файл docker.

RUN unzip $WLS_PKG 
RUN $JAVA_HOME/bin/java -Xmx1024m -jar /u01/app/oracle/$WLS_JAR -silent -responseFile /u01/app/oracle/wls.rsp -invPtrLoc /u01/app/oracle/oraInst.loc > install.log
RUN rm -f $WLS_PKG

RUN . $WLS_HOME/server/bin/setWLSEnv.sh && java weblogic.version
RUN java weblogic.WLST -skipWLSModuleScanning create_basedomain.py

WORKDIR /u01/app/oracle

CMD ./startscript.sh

Команды сборки и запуска docker:

docker build -f Dockerfile-weblogic --tag="weblogic12c:startweb" /var/dprojects
docker rund -d -it weblogic12c:startweb
docker exec -it 6313c4caccd3 bash

1 Ответ

1 голос
/ 10 апреля 2019

Пожалуйста, используйте supervisord для запуска нескольких служб в контейнере Docker.Это сделает весь процесс более надежным и надежным.Запустите supervisord -n в качестве команды CMD и настройте все свои службы в /etc/supervisord.conf.

Пример конфигурации будет выглядеть так:

[program:WebLogic]
command=/u01/app/oracle/product/wls122100/domains/verdomain/bin/startWebLogic.sh -D
stderr_logfile = /var/log/supervisord/WebLogic-stderr.log
stdout_logfile = /var/log/supervisord/WebLogic-stdout.log
autorestart=unexpected

[program:NodeManager]
command=/u01/app/oracle/product/wls122100/domains/verdomain/bin/startNodeManager.sh -D
stderr_logfile = /var/log/supervisord/NodeManager-stderr.log
stdout_logfile = /var/log/supervisord/NodeManager-stdout.log
autorestart=unexpected

Он будет обрабатывать все, что вы пытаетесьделать со сценарием оболочки.
Надеюсь, это поможет!

...