official-images/test/retry.sh

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