rusbaron
@rusbaron
Не стыдно не знать, стыдно не интересоваться

Как правильно запустить сервис внутри docker контейнера?

Решил для изучения docker создать контейнер с youtrack, но столкнулся с проблемой, контейнер после запуска работает несколько секунд(пока youtrack запускается), а потом сразу выключается - Youtrack демонизировался. Как было написано в данном ответе, как только главный процесс завершается, то контейнер сразу выключается. Как правильно обернуть запуск youtrack, чтобы контейнер не выходил? Пытался ещё скрестить с подходом teamcity , оставив начальную инициализацию переменных и trap, но если честно плохо понимаю этот trap, в документации есть пару примеров но синтаксис с wait $! и exit $? мне не понятен.
Видел ещё,что некоторые добавляют в скрипт бесконечный цикл или tail /dev/null, но это как то по костыльному смотрится.

Dockerfile:
FROM opensuse

ENV YT_DIST=/opt/youtrack 
ENV YT_DATA=$YT_DIST/data \
    YT_LOGS=$YT_DIST/logs \
    YT_BACKUP=$YT_DIST/backups

RUN echo $YT_DIST && echo $YT_DATA

COPY dist ${YT_DIST}
COPY runserver.sh ${YT_DIST}/runserver.sh

EXPOSE 8080

VOLUME $YT_DATA \
	   $YT_LOGS \
	   $YT_BACKUP

WORKDIR ${YT_DIST}

RUN chmod +x runserver.sh

#RUN ls

CMD ["./runserver.sh"]


runserver.sh
#!/bin/bash

# Setting default values if variables not present
: ${YT_DIST:=/opt/youtrack}

# Set traps to gently shutdown server on `docker stop`, `docker restart` or `docker kill -s 15`
trap "'${YT_DIST}/bin/youtrack.sh' stop; exit \$?" TERM INT HUP

# & and wait required for traps to work
"${YT_DIST}/bin/youtrack.sh" start &
wait $!
exit $?


youtrack.sh
#!/bin/sh
# --------------------------------------------------------------------------------------
# DO NOT CHANGE THIS FILE! ALL YOUR CHANGES WILL BE ELIMINATED AFTER AUTOMATIC UPGRADE.
# --------------------------------------------------------------------------------------

jb_resolve() {
  if [ -L "$1" ]; then
    RESULT=`realpath "$1" 2>/dev/null`
    if [ $? -eq 0 ]; then
      echo `jb_resolve "$RESULT"`
      return
    fi

    RESULT=`readlink -f "$1" 2>/dev/null`
    if [ $? -eq 0 ]; then
      echo `jb_resolve "$RESULT"`
      return
    fi

    RESULT=`readlink "$1" 2>/dev/null`
    if [ $? -eq 0 ]; then
      echo `jb_resolve "$RESULT"`
      return
    fi

    RESULT=`grealpath "$1" 2>/dev/null`
    if [ $? -eq 0 ]; then
      echo `jb_resolve "$RESULT"`
      return
    fi
  fi

  echo "$1"
}

JB_CURRENT_DIR=`pwd`
JB_RESOLVED_SCRIPT=`jb_resolve "$0"`
JB_SCRIPT_DIR=`dirname "$JB_RESOLVED_SCRIPT"`
cd "$JB_SCRIPT_DIR/.."

jb_exit() {
  cd "$JB_CURRENT_DIR"
  exit $1
}

# workaround for Solaris; use this instead of "export a=b"
jb_export() {
  eval $1=\$2
  export $1
}

LAUNCHER_SETENV_SH="launcher/conf/launcher.setenv.sh"
if [ -f "$LAUNCHER_SETENV_SH" ]; then . "$LAUNCHER_SETENV_SH"; fi

. launcher/bin/findJava.sh

if [ -z "$MIN_REQUIRED_JAVA_VERSION" ]; then
  MIN_REQUIRED_JAVA_VERSION="1.6"
else
  version_ge $MIN_REQUIRED_JAVA_VERSION 1.6
  if [ $? -ne 0 ]; then
    echo "Cannot start launcher with Java $MIN_REQUIRED_JAVA_VERSION, will look for at least Java 1.6." 1>&2
    MIN_REQUIRED_JAVA_VERSION="1.6"
  fi
fi

EXPLICIT_JAVA_FILE="conf/$APP_FILE_NAME.java.path"
if [ -f "$EXPLICIT_JAVA_FILE" ]; then
  FJ_JAVA_EXEC=`head -n 1 "$EXPLICIT_JAVA_FILE"`
fi

find_java $MIN_REQUIRED_JAVA_VERSION $ADDITIONAL_FIND_JAVA_DIRS
if [ $? -ne 0 ]; then
  jb_exit 255
fi

jb_export FJ_JAVA_EXEC "$FJ_JAVA_EXEC"

version_ge $FJ_JAVA_VERSION 1.8
if [ $? -eq 0 ]; then
  jb_export JL_LAUNCHER_OPTS "$LAUNCHER_OPTS $LAUNCHER_MAX_METASPACE_SIZE_OPTION"
else
  jb_export JL_LAUNCHER_OPTS "$LAUNCHER_OPTS $LAUNCHER_MAX_PERM_SIZE_OPTION"
fi

jb_export JL_JAVA_PROPERTIES "$LAUNCHER_ENV_OPTS"

JB_COMMAND_SUFFIX="-jar launcher/lib/$APP_FILE_NAME-launcher.jar"

LAUNCH_INFO=`"$FJ_JAVA_EXEC" $JL_LAUNCHER_OPTS $JB_COMMAND_SUFFIX get-launch-info "$@" 2>/dev/null`

APP_DISPLAY_NAME=`echo "$LAUNCH_INFO" | head -1 | cut -c 3-`
IS_SERVICE=`echo "$LAUNCH_INFO" | head -2 | tail -1 | cut -c 3-`

if [ -n "$IS_SERVICE" ]; then
  jb_export JL_LAUNCHER_OPTS "-Xrs $JL_LAUNCHER_OPTS"
fi

shutdown() {
    "$FJ_JAVA_EXEC" $JL_LAUNCHER_OPTS $JB_COMMAND_SUFFIX stop >/dev/null 2>/dev/null
}

trap shutdown 2 15

JB_HOME=`pwd`
"$FJ_JAVA_EXEC" "-Djl.service=$APP_DISPLAY_NAME Launcher" "-Djl.home=$JB_HOME" $JL_LAUNCHER_OPTS $JB_COMMAND_SUFFIX "$@" &
wait $!
jb_exit $?

  • Вопрос задан
  • 1475 просмотров
Пригласить эксперта
Ответы на вопрос 3
@MadridianFox
Web-программист, многостаночник
В runserver выполняется команда
"${YT_DIST}/bin/youtrack.sh" start &
Амперсанд в конце указывает на то что это надо запустить и отправить в бэкграунд.
При этом тот факт что в /bin/youtrack.sh передаётся аргумент start говорит о том что это ещё один стартер. Надо посмотреть на его код.
Ответ написан
fox_12
@fox_12
Расставляю биты, управляю заряженными частицами
Пропишите в настройках supervisor настройки вашего сервиса, и запускайте через:
/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
Ответ написан
@AbaySeitkaliyev
попробуй поискать инфу в гугле режим докера - detach
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы