42 lines
1 KiB
Bash
Executable file
42 lines
1 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
set -e
|
|
|
|
opts="$(getopt -o 'i:c:t:s:' --long 'image:,cid:,tries:,sleep:' -- "$@")"
|
|
eval set -- "$opts"
|
|
while true; do
|
|
flag=$1
|
|
shift
|
|
case "$flag" in
|
|
--image|-i) image="$1" && shift ;;
|
|
--cid|-c) cid="$1" && shift ;;
|
|
--tries|-t) tries="$1" && shift ;;
|
|
--sleep|-s) sleep="$1" && shift ;;
|
|
--) break;;
|
|
esac
|
|
done
|
|
|
|
if [ $# -eq 0 ]; then
|
|
echo >&2 'retry.sh requires a command to run'
|
|
false
|
|
fi
|
|
|
|
: ${tries:=10}
|
|
: ${sleep:=2}
|
|
|
|
while ! eval "$@" &> /dev/null; do
|
|
(( tries-- ))
|
|
if [ $tries -le 0 ]; then
|
|
echo >&2 "${image:-the container} failed to accept connections in a reasonable amount of time!"
|
|
[ "$cid" ] && ( set -x && docker logs "$cid" ) >&2 || true
|
|
( set -x && eval "$@" ) >&2 || true # to hopefully get a useful error message
|
|
false
|
|
fi
|
|
if [ "$cid" ] && [ "$(docker inspect -f '{{.State.Running}}' "$cid" 2>/dev/null)" != 'true' ]; then
|
|
echo >&2 "${image:-the container} stopped unexpectedly!"
|
|
( set -x && docker logs "$cid" ) >&2 || true
|
|
false
|
|
fi
|
|
echo >&2 -n .
|
|
sleep "$sleep"
|
|
done
|