File size: 1,622 Bytes
422bbda
 
 
b795535
eea264b
cb45783
 
 
 
e079f18
b795535
 
 
 
 
 
422bbda
eea264b
 
 
 
 
 
 
 
 
 
 
 
 
b795535
 
 
 
 
 
cb45783
b795535
 
 
 
 
 
 
 
 
e079f18
 
cb45783
e079f18
 
 
cb45783
 
 
e079f18
 
 
b795535
e079f18
 
 
422bbda
e079f18
 
cb45783
eea264b
e079f18
 
 
b795535
e079f18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#!/bin/sh
set -eu

: "${SUPERVISORD_BIN:=/usr/bin/supervisord}"
: "${SUPERVISOR_CONF_TEMPLATE:=/etc/supervisord.conf.template}"
: "${APP_BINARY_PATH:=/app/app}"
: "${RUNTIME_DIR:=/tmp/runtime}"
: "${SUPERVISOR_CONF:=/etc/supervisord.conf}"
: "${SUPERVISOR_PROGRAM_NAME:=app}"
: "${OPEN_FILE_LIMIT:=65535}"

export RUNTIME_DIR

shell_quote() {
  printf "'%s'" "$(printf '%s' "$1" | sed "s/'/'\"'\"'/g")"
}

escape_sed_replacement() {
  printf '%s' "$1" | sed 's/[\/&]/\\&/g'
}

write_supervisord_conf() {
  mkdir -p "$(dirname "$SUPERVISOR_CONF")"
  app_program_name=$(escape_sed_replacement "$SUPERVISOR_PROGRAM_NAME")

  sed \
    -e "s/__APP_PROGRAM__/$app_program_name/g" \
    "$SUPERVISOR_CONF_TEMPLATE" > "$SUPERVISOR_CONF"
}

write_run_app_script() {
  run_app_script="$RUNTIME_DIR/run-app.sh"

  {
    printf '#!/bin/sh\n'
    printf 'set -eu\n'
    printf 'exec "%s"' "$APP_BINARY_PATH"
    for arg in "$@"; do
      printf ' %s' "$(shell_quote "$arg")"
    done
    printf '\n'
  } > "$run_app_script"

  chmod +x "$run_app_script"
}

prepare_runtime_environment() {
  ulimit -n "$OPEN_FILE_LIMIT"
  mkdir -p "$RUNTIME_DIR"
  rm -f "$RUNTIME_DIR/supervisor.sock" "$RUNTIME_DIR/supervisord.pid"
}

validate_app_binary_or_exit() {
  if [ ! -x "$APP_BINARY_PATH" ]; then
    echo "错误: APP_BINARY_PATH 指向的文件不存在或不可执行: $APP_BINARY_PATH" >&2
    exit 1
  fi
}

start_supervisord() {
  exec "$SUPERVISORD_BIN" -c "$SUPERVISOR_CONF"
}

main() {
  prepare_runtime_environment
  validate_app_binary_or_exit
  write_supervisord_conf
  write_run_app_script "$@"
  start_supervisord
}

main "$@"