start.sh 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #!/bin/bash
  2. # usage: check/replace/serivce_wait/service_start
  3. # cd to /usr/local/bin
  4. cd $(dirname $0)
  5. echo
  6. # version
  7. if [ -f ${APP_HOME}/${APP_NAME}/VERSION ]; then
  8. echo -e "Checking env for ${APP_NAME}..\n`cat ${APP_HOME}/${APP_NAME}/VERSION`"
  9. else
  10. echo "Checking env for ${APP_NAME}.."
  11. fi
  12. # check dir
  13. if [ -d ../conf ]; then
  14. cd ../conf
  15. else
  16. echo "please put conf/ and start.sh to the same directory."
  17. exit 1
  18. fi
  19. # get conf files
  20. CONF_FILES=`find $(pwd) -type f | grep -v "\.svn" | grep -v "\.git"`
  21. # if no config file exists
  22. if [ -z "$CONF_FILES" ]; then
  23. echo "No conf files found, pass."
  24. fi
  25. # has config file
  26. for f in $CONF_FILES; do
  27. # metadata => "<location:LOCATION_OF_FILE> [MODE:600] [OWNER:USERNAME]"
  28. # if there is " " " in value, use "\" to escape
  29. # use "${APP_HOME}/${APP_NAME}" to module home
  30. # dos2unix
  31. if which dos2unix &>/dev/null; then
  32. dos2unix $f
  33. else
  34. sed -i 's/.$//' $f
  35. fi
  36. # get the location of metadata
  37. METADATA_LOCATION=$(grep -iw metadata $f | awk -F'=>' '{print $2}' | \
  38. awk -F'location:' '{print $2}' | sed -n '1p' | \
  39. awk '{print $1}' | tr -d ',;"' | tr -d "'")
  40. # replace the variable to true path
  41. METADATA_LOCATION=`eval echo $METADATA_LOCATION`
  42. # there is no location tag of metadata
  43. if [ -z "$METADATA_LOCATION" ]; then
  44. echo "\"location\" of metadata in \"$f\" not define!"
  45. check_passed="$check_passed false"
  46. continue
  47. else
  48. # if is a path
  49. if `dirname $METADATA_LOCATION &>/dev/null`; then
  50. # if does not exist, mkdir
  51. if ! [ -d "$(dirname $METADATA_LOCATION)" ]; then
  52. echo "mkdir -p $(dirname $METADATA_LOCATION)"
  53. mkdir -p $(dirname $METADATA_LOCATION)
  54. fi
  55. else
  56. echo "\"location\" of metadata in \"$f\" not PATH format!"
  57. check_passed="$check_passed false"
  58. continue
  59. fi
  60. dockerize_template="${dockerize_template} -template ${f}:${METADATA_LOCATION}"
  61. fi
  62. # has location but no {{ VAR }}
  63. VAR_IN_BRACE=$(grep {{.*}} $f | sed -n 's/.*{{ *\(.*\) *}}.*/\1/p')
  64. if [ -z "$VAR_IN_BRACE" ]; then
  65. echo "skip \"${f}\" without replacing, pass."
  66. continue
  67. # has location and {{ VAR }}
  68. else
  69. # loop to check
  70. for i in $VAR_IN_BRACE; do
  71. VAR_TO_CHECK=${i##.Env.}
  72. VAR_TO_CHECK=`echo $VAR_TO_CHECK`
  73. # Check the value
  74. if [ -z "${!VAR_TO_CHECK}" ]; then
  75. echo "Can not get env: \"${VAR_TO_CHECK}\" in file: \"$f\" !"
  76. check_passed="$check_passed false"
  77. else
  78. echo "|- ${VAR_TO_CHECK}=${!VAR_TO_CHECK}"
  79. fi
  80. done
  81. fi
  82. done
  83. # if error, exit
  84. if echo $check_passed | grep -wq "false"; then
  85. echo
  86. echo "To inject variables to container, you can do it in:"
  87. echo " 1. Dockerfile"
  88. echo " 2. compose file (recommand)"
  89. echo " 3. docker run with \"-e\" option"
  90. echo "And you can receive value with \"{{ .Env.VARIABLE_NAME }}\" in config file."
  91. echo
  92. exit 1
  93. else
  94. echo "Env check pass."
  95. echo
  96. fi
  97. # cd to workdir (or bin dir)
  98. # prevent "auto generate core file issue found by zhuwen"
  99. cd ${APP_HOME}/${APP_NAME} || cd /usr/local/bin
  100. # get dependice
  101. for i in ${!APP_DEP*}; do
  102. dockerize_wait="${dockerize_wait} -wait ${!i}"
  103. done
  104. # replace、Serivce wait、Service start
  105. echo -n "Pre-starting.."
  106. dockerize \
  107. ${dockerize_template} \
  108. ${dockerize_wait} -timeout 1200s \
  109. -stdout /var/log/${APP_NAME}.log \
  110. -stderr /var/log/${APP_NAME}.log \
  111. echo "done"
  112. echo
  113. # get logs
  114. for log in ${!APP_LOG*}; do
  115. # pre-create log file
  116. mkdir -p `dirname ${!log}`
  117. touch ${!log}
  118. LOG_LIST="${LOG_LIST} ${!log}"
  119. done
  120. # start
  121. Service_Start() {
  122. echo "Starting ${APP_NAME}.."
  123. ####### START COMMAND HERE #########
  124. set -e
  125. bash -x `which start_${APP_NAME}` && \
  126. echo "success" && \
  127. tail -f /var/log/${APP_NAME}.log $LOG_LIST
  128. ####################################
  129. }
  130. # default: start the service
  131. Service_Start