start.sh 3.9 KB

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