Skip to content

Commit

Permalink
Simplify signal handling (#767)
Browse files Browse the repository at this point in the history
Avoid implementing a complex signal relaying mechanism in `docker-entrypoint*.sh`
Instead, the shell performs `exec node ...` and the `node` process receives the signals directly.

Related to #560, #575, which were my initial implemetation.
  • Loading branch information
zstadler authored Feb 19, 2023
1 parent 49f342f commit acde7b0
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 58 deletions.
32 changes: 3 additions & 29 deletions docker-entrypoint.sh
Original file line number Diff line number Diff line change
@@ -1,35 +1,9 @@
#!/bin/sh

set -e

handle() {
SIGNAL=$(( $? - 128 ))
echo "Caught signal ${SIGNAL}, stopping gracefully"
kill -s ${SIGNAL} $(pidof node) 2>/dev/null
}

trap handle INT TERM

refresh() {
SIGNAL=$(( $? - 128 ))
echo "Caught signal ${SIGNAL}, refreshing"
kill -s ${SIGNAL} $(pidof node) 2>/dev/null
}

trap refresh HUP

if ! which -- "${1}"; then
# first arg is not an executable
xvfb-run -a --server-args="-screen 0 1024x768x24" -- node /usr/src/app/ "$@" &
# Wait exits immediately on signals which have traps set. Store return value and wait
# again for all jobs to actually complete before continuing.
wait $! || RETVAL=$?
while [ ${RETVAL} = 129 ] ; do
# Refressh signal HUP received. Continue waiting for signals.
wait $! || RETVAL=$?
done
wait
exit ${RETVAL}
export DISPLAY=:99
Xvfb "${DISPLAY}" -nolisten unix &
exec node /usr/src/app/ -p 80 "$@"
fi

exec "$@"
30 changes: 1 addition & 29 deletions docker-entrypoint_light.sh
Original file line number Diff line number Diff line change
@@ -1,35 +1,7 @@
#!/bin/sh

set -e

handle() {
SIGNAL=$(( $? - 128 ))
echo "Caught signal ${SIGNAL}, stopping gracefully"
kill -s ${SIGNAL} $(pidof node) 2>/dev/null
}

trap handle INT TERM

refresh() {
SIGNAL=$(( $? - 128 ))
echo "Caught signal ${SIGNAL}, refreshing"
kill -s ${SIGNAL} $(pidof node) 2>/dev/null
}

trap refresh HUP

if ! which -- "${1}"; then
# first arg is not an executable
node /usr/src/app/ "$@" &
# Wait exits immediately on signals which have traps set. Store return value and wait
# again for all jobs to actually complete before continuing.
wait $! || RETVAL=$?
while [ ${RETVAL} = 129 ] ; do
# Refressh signal HUP received. Continue waiting for signals.
wait $! || RETVAL=$?
done
wait
exit ${RETVAL}
exec node /usr/src/app/ -p 80 "$@"
fi

exec "$@"

0 comments on commit acde7b0

Please sign in to comment.