docker-entry.sh 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #!/bin/bash
  2. set -e
  3. WAR_FILE=/diaowen.war
  4. UNPACK_DIR=/dwsurvey
  5. WEBAPP_BASE=$CATALINA_HOME/webapps
  6. # determine context root path
  7. if [[ "x${CONTEXT_ROOT}x" == "xx" || "$CONTEXT_ROOT" == "/" ]]; then
  8. CONTEXT_PATH=ROOT
  9. else
  10. CONTEXT_PATH=${CONTEXT_ROOT}
  11. fi
  12. WEBAPP_DIR=${WEBAPP_BASE}/${CONTEXT_PATH}
  13. CONF_DIR=${WEBAPP_DIR}/WEB-INF/classes/conf
  14. require_env() {
  15. local ENV_NAME="$1"
  16. # if docker provides secret, secret wins env
  17. if [[ -r "/run/secrets/$ENV_NAME" ]]; then
  18. eval $ENV_NAME=$(cat /run/secrets/$ENV_NAME)
  19. fi
  20. eval ENV_VALUE=\$$ENV_NAME
  21. if [ -z "$ENV_VALUE" ]; then
  22. echo "Missing required environment variable: $ENV_NAME"
  23. exit 1
  24. fi
  25. }
  26. init_run() {
  27. # check variables required for initialization
  28. require_env MYSQL_HOST
  29. require_env MYSQL_PORT
  30. require_env MYSQL_DATABASE
  31. require_env MYSQL_USER
  32. require_env MYSQL_PASSWORD
  33. echo "Unpacking war ..."
  34. mkdir -p "$UNPACK_DIR"
  35. unzip -q -x "$WAR_FILE" -d "$UNPACK_DIR" \
  36. -x "WEB-INF/wjHtml/*" \
  37. -x "WEB-INF/classes/conf/site/*"
  38. ln -snf "$UNPACK_DIR" "$WEBAPP_DIR"
  39. echo "Configuring dwsurvey ..."
  40. sed -i "s^jdbc.url=.*\$jdbc.url=jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE}?useUnicode=true\&characterEncoding=utf8g;
  41. s^jdbc.username=.*\$jdbc.username=${MYSQL_USER}g;
  42. s^jdbc.password=.*\$jdbc.password=${MYSQL_PASSWORD}g" \
  43. ${CONF_DIR}/application.properties
  44. migrate
  45. }
  46. migrate() {
  47. # TODO We should use some migration mechanism.
  48. # For now, let's do it in a dirty hacky way.
  49. require_env ADMIN_EMAIL
  50. require_env ADMIN_PASSWORD
  51. # DIRTY hack, check if table t_user exist, if exist, skip migration
  52. echo "Checking if table t_user exist ..."
  53. if [[ $(mysql -N -s -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" --password="$MYSQL_PASSWORD" -e \
  54. "SELECT count(*) FROM information_schema.TABLES
  55. WHERE (TABLE_SCHEMA='${MYSQL_DATABASE}') AND (TABLE_NAME='t_user')") \
  56. -eq 1 ]]; then
  57. echo "table t_user exists, skipping migration."
  58. return
  59. fi
  60. local MIGRATION_FILE=/tmp/migrate.sql
  61. cp ${WEBAPP_DIR}/WEB-INF/classes/conf/sql/dwsurvey.sql $MIGRATION_FILE
  62. # remove "CREATE DATABASE" clouse, db should be created outside, so no root db account required
  63. sed -i '/CREATE DATABASE/d' $MIGRATION_FILE
  64. # use the specified database name
  65. sed -i "s/USE \`dwsurvey\`;/USE \`${MYSQL_DATABASE}\`;/g" $MIGRATION_FILE
  66. # remove default user
  67. sed -i '/INSERT INTO `t_user`/d' $MIGRATION_FILE
  68. # remove example survey (just don't INSERT anything), meaningless for production usage
  69. sed -i '/INSERT INTO/d' $MIGRATION_FILE
  70. # apply migration file
  71. echo "Applying migration ..."
  72. mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" --password="$MYSQL_PASSWORD" < $MIGRATION_FILE
  73. rm -f "$MIGRATION_FILE"
  74. # create admin user
  75. local ADMIN_LOGIN=${ADMIN_EMAIL%%@*} # use email prefix for login
  76. local ADMIN_SHA_PASSWORD=$(echo -n "$ADMIN_PASSWORD" | sha1sum | cut -d' ' -f 1)
  77. echo "Creating admin user ..."
  78. mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" --password="$MYSQL_PASSWORD" "$MYSQL_DATABASE" -e \
  79. "INSERT INTO \`t_user\`
  80. (id, email, login_name, name, sha_password, status, version)
  81. VALUES (1, '$ADMIN_EMAIL', '$ADMIN_LOGIN', '$ADMIN_LOGIN', '$ADMIN_SHA_PASSWORD', 1, 1);"
  82. }
  83. # if webapp directory does not exist, it's first run
  84. if [ ! -d "$WEBAPP_DIR" ]; then
  85. init_run
  86. fi
  87. # start tomcat
  88. if [ -z "$@" ]; then
  89. exec $CATALINA_HOME/bin/catalina.sh run
  90. else
  91. exec "$@"
  92. fi