Skip to content

Commit fe24d06

Browse files
committed
Add wait-for-it.sh to code base
1 parent 6a66019 commit fe24d06

File tree

2 files changed

+184
-3
lines changed

2 files changed

+184
-3
lines changed

.docker/sql.Dockerfile

+1-3
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ WORKDIR /code
77

88
RUN apk add wget
99

10-
RUN cd /bin && \
11-
wget https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh && \
12-
chmod +x wait-for-it.sh
10+
COPY .docker/wait-for-it.sh /bin
1311

1412
CMD /bin/wait-for-it.sh database-server:5432 && /code/scripts/docker/run-sql.sh

.docker/wait-for-it.sh

+183
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
#!/usr/bin/env bash
2+
# Use this script to test if a given TCP host/port are available
3+
# https://github.com/vishnubob/wait-for-it
4+
5+
WAITFORIT_cmdname=${0##*/}
6+
7+
echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi }
8+
9+
usage()
10+
{
11+
cat << USAGE >&2
12+
Usage:
13+
$WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args]
14+
-h HOST | --host=HOST Host or IP under test
15+
-p PORT | --port=PORT TCP port under test
16+
Alternatively, you specify the host and port as host:port
17+
-s | --strict Only execute subcommand if the test succeeds
18+
-q | --quiet Don't output any status messages
19+
-t TIMEOUT | --timeout=TIMEOUT
20+
Timeout in seconds, zero for no timeout
21+
-- COMMAND ARGS Execute command with args after the test finishes
22+
USAGE
23+
exit 1
24+
}
25+
26+
wait_for()
27+
{
28+
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
29+
echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
30+
else
31+
echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout"
32+
fi
33+
WAITFORIT_start_ts=$(date +%s)
34+
while :
35+
do
36+
if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then
37+
nc -z $WAITFORIT_HOST $WAITFORIT_PORT
38+
WAITFORIT_result=$?
39+
else
40+
(echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1
41+
WAITFORIT_result=$?
42+
fi
43+
if [[ $WAITFORIT_result -eq 0 ]]; then
44+
WAITFORIT_end_ts=$(date +%s)
45+
echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds"
46+
break
47+
fi
48+
sleep 1
49+
done
50+
return $WAITFORIT_result
51+
}
52+
53+
wait_for_wrapper()
54+
{
55+
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
56+
if [[ $WAITFORIT_QUIET -eq 1 ]]; then
57+
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
58+
else
59+
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
60+
fi
61+
WAITFORIT_PID=$!
62+
trap "kill -INT -$WAITFORIT_PID" INT
63+
wait $WAITFORIT_PID
64+
WAITFORIT_RESULT=$?
65+
if [[ $WAITFORIT_RESULT -ne 0 ]]; then
66+
echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
67+
fi
68+
return $WAITFORIT_RESULT
69+
}
70+
71+
# process arguments
72+
while [[ $# -gt 0 ]]
73+
do
74+
case "$1" in
75+
*:* )
76+
WAITFORIT_hostport=(${1//:/ })
77+
WAITFORIT_HOST=${WAITFORIT_hostport[0]}
78+
WAITFORIT_PORT=${WAITFORIT_hostport[1]}
79+
shift 1
80+
;;
81+
--child)
82+
WAITFORIT_CHILD=1
83+
shift 1
84+
;;
85+
-q | --quiet)
86+
WAITFORIT_QUIET=1
87+
shift 1
88+
;;
89+
-s | --strict)
90+
WAITFORIT_STRICT=1
91+
shift 1
92+
;;
93+
-h)
94+
WAITFORIT_HOST="$2"
95+
if [[ $WAITFORIT_HOST == "" ]]; then break; fi
96+
shift 2
97+
;;
98+
--host=*)
99+
WAITFORIT_HOST="${1#*=}"
100+
shift 1
101+
;;
102+
-p)
103+
WAITFORIT_PORT="$2"
104+
if [[ $WAITFORIT_PORT == "" ]]; then break; fi
105+
shift 2
106+
;;
107+
--port=*)
108+
WAITFORIT_PORT="${1#*=}"
109+
shift 1
110+
;;
111+
-t)
112+
WAITFORIT_TIMEOUT="$2"
113+
if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi
114+
shift 2
115+
;;
116+
--timeout=*)
117+
WAITFORIT_TIMEOUT="${1#*=}"
118+
shift 1
119+
;;
120+
--)
121+
shift
122+
WAITFORIT_CLI=("$@")
123+
break
124+
;;
125+
--help)
126+
usage
127+
;;
128+
*)
129+
echoerr "Unknown argument: $1"
130+
usage
131+
;;
132+
esac
133+
done
134+
135+
if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then
136+
echoerr "Error: you need to provide a host and port to test."
137+
usage
138+
fi
139+
140+
WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15}
141+
WAITFORIT_STRICT=${WAITFORIT_STRICT:-0}
142+
WAITFORIT_CHILD=${WAITFORIT_CHILD:-0}
143+
WAITFORIT_QUIET=${WAITFORIT_QUIET:-0}
144+
145+
# Check to see if timeout is from busybox?
146+
WAITFORIT_TIMEOUT_PATH=$(type -p timeout)
147+
WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH)
148+
149+
WAITFORIT_BUSYTIMEFLAG=""
150+
if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then
151+
WAITFORIT_ISBUSY=1
152+
# Check if busybox timeout uses -t flag
153+
# (recent Alpine versions don't support -t anymore)
154+
if timeout &>/dev/stdout | grep -q -e '-t '; then
155+
WAITFORIT_BUSYTIMEFLAG="-t"
156+
fi
157+
else
158+
WAITFORIT_ISBUSY=0
159+
fi
160+
161+
if [[ $WAITFORIT_CHILD -gt 0 ]]; then
162+
wait_for
163+
WAITFORIT_RESULT=$?
164+
exit $WAITFORIT_RESULT
165+
else
166+
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
167+
wait_for_wrapper
168+
WAITFORIT_RESULT=$?
169+
else
170+
wait_for
171+
WAITFORIT_RESULT=$?
172+
fi
173+
fi
174+
175+
if [[ $WAITFORIT_CLI != "" ]]; then
176+
if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then
177+
echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess"
178+
exit $WAITFORIT_RESULT
179+
fi
180+
exec "${WAITFORIT_CLI[@]}"
181+
else
182+
exit $WAITFORIT_RESULT
183+
fi

0 commit comments

Comments
 (0)