retry.sh 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #!/bin/bash
  2. set -e
  3. opts="$(getopt -o 'i:c:t:s:' --long 'image:,cid:,tries:,sleep:' -- "$@")"
  4. eval set -- "$opts"
  5. while true; do
  6. flag=$1
  7. shift
  8. case "$flag" in
  9. --image|-i) image="$1" && shift ;;
  10. --cid|-c) cid="$1" && shift ;;
  11. --tries|-t) tries="$1" && shift ;;
  12. --sleep|-s) sleep="$1" && shift ;;
  13. --) break;;
  14. esac
  15. done
  16. if [ $# -eq 0 ]; then
  17. echo >&2 'retry.sh requires a command to run'
  18. false
  19. fi
  20. : ${tries:=10}
  21. : ${sleep:=2}
  22. while ! eval "$@" &> /dev/null; do
  23. (( tries-- ))
  24. if [ $tries -le 0 ]; then
  25. echo >&2 "${image:-the container} failed to accept connections in a reasonable amount of time!"
  26. [ "$cid" ] && ( set -x && docker logs "$cid" ) >&2 || true
  27. ( set -x && eval "$@" ) >&2 || true # to hopefully get a useful error message
  28. false
  29. fi
  30. if [ "$cid" ] && [ "$(docker inspect -f '{{.State.Running}}' "$cid" 2>/dev/null)" != 'true' ]; then
  31. echo >&2 "${image:-the container} stopped unexpectedly!"
  32. ( set -x && docker logs "$cid" ) >&2 || true
  33. false
  34. fi
  35. echo >&2 -n .
  36. sleep "$sleep"
  37. done