parent
ab9acba818
commit
ab5d8aad63
@ -0,0 +1,32 @@ |
||||
db: |
||||
image: postgres:9.4.5 |
||||
environment: |
||||
POSTGRES_USER: app |
||||
POSTGRES_PASSWORD: p4ssw0rd |
||||
POSTGRES_DB: app |
||||
expose: |
||||
- '5432' |
||||
|
||||
worker: &ruby |
||||
build: . |
||||
volumes: |
||||
- .:/usr/src/app |
||||
links: |
||||
- db |
||||
environment: |
||||
- "RAILS_CACHE_STORE=file_store" |
||||
- "DATABASE_URL=postgresql://app:p4ssw0rd@db:5432/app?encoding=utf8&pool=5&timeout=5000" |
||||
- "SECRET_KEY_BASE=d4e74f017910ac56c6ebad01165b7e1b37f4c9c02e9716836f8670cdc8d65a231e64e4f6416b19c8" |
||||
- "RAILS_ENV=production" |
||||
command: "./docker/wait-for-it.sh -t 60 -h db -p 5432 --strict -- ./docker/worker" |
||||
|
||||
web: |
||||
<<: *ruby |
||||
ports: |
||||
- "80:8080" |
||||
command: "./docker/wait-for-it.sh -t 60 -h db -p 5432 --strict -- ./docker/web" |
||||
|
||||
seed: |
||||
<<: *ruby |
||||
command: "./docker/wait-for-it.sh -t 60 -h db -p 5432 --strict -- bundle exec rake db:migrate db:seed" |
||||
restart: no |
@ -0,0 +1,161 @@ |
||||
#!/usr/bin/env bash |
||||
# Use this script to test if a given TCP host/port are available |
||||
|
||||
cmdname=$(basename $0) |
||||
|
||||
echoerr() { if [[ $QUIET -ne 1 ]]; then echo "$@" 1>&2; fi } |
||||
|
||||
usage() |
||||
{ |
||||
cat << USAGE >&2 |
||||
Usage: |
||||
$cmdname host:port [-s] [-t timeout] [-- command args] |
||||
-h HOST | --host=HOST Host or IP under test |
||||
-p PORT | --port=PORT TCP port under test |
||||
Alternatively, you specify the host and port as host:port |
||||
-s | --strict Only execute subcommand if the test succeeds |
||||
-q | --quiet Don't output any status messages |
||||
-t TIMEOUT | --timeout=TIMEOUT |
||||
Timeout in seconds, zero for no timeout |
||||
-- COMMAND ARGS Execute command with args after the test finishes |
||||
USAGE |
||||
exit 1 |
||||
} |
||||
|
||||
wait_for() |
||||
{ |
||||
if [[ $TIMEOUT -gt 0 ]]; then |
||||
echoerr "$cmdname: waiting $TIMEOUT seconds for $HOST:$PORT" |
||||
else |
||||
echoerr "$cmdname: waiting for $HOST:$PORT without a timeout" |
||||
fi |
||||
start_ts=$(date +%s) |
||||
while : |
||||
do |
||||
(echo > /dev/tcp/$HOST/$PORT) >/dev/null 2>&1 |
||||
result=$? |
||||
if [[ $result -eq 0 ]]; then |
||||
end_ts=$(date +%s) |
||||
echoerr "$cmdname: $HOST:$PORT is available after $((end_ts - start_ts)) seconds" |
||||
break |
||||
fi |
||||
sleep 1 |
||||
done |
||||
return $result |
||||
} |
||||
|
||||
wait_for_wrapper() |
||||
{ |
||||
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692 |
||||
if [[ $QUIET -eq 1 ]]; then |
||||
timeout $TIMEOUT $0 --quiet --child --host=$HOST --port=$PORT --timeout=$TIMEOUT & |
||||
else |
||||
timeout $TIMEOUT $0 --child --host=$HOST --port=$PORT --timeout=$TIMEOUT & |
||||
fi |
||||
PID=$! |
||||
trap "kill -INT -$PID" INT |
||||
wait $PID |
||||
RESULT=$? |
||||
if [[ $RESULT -ne 0 ]]; then |
||||
echoerr "$cmdname: timeout occurred after waiting $TIMEOUT seconds for $HOST:$PORT" |
||||
fi |
||||
return $RESULT |
||||
} |
||||
|
||||
# process arguments |
||||
while [[ $# -gt 0 ]] |
||||
do |
||||
case "$1" in |
||||
*:* ) |
||||
hostport=(${1//:/ }) |
||||
HOST=${hostport[0]} |
||||
PORT=${hostport[1]} |
||||
shift 1 |
||||
;; |
||||
--child) |
||||
CHILD=1 |
||||
shift 1 |
||||
;; |
||||
-q | --quiet) |
||||
QUIET=1 |
||||
shift 1 |
||||
;; |
||||
-s | --strict) |
||||
STRICT=1 |
||||
shift 1 |
||||
;; |
||||
-h) |
||||
HOST="$2" |
||||
if [[ $HOST == "" ]]; then break; fi |
||||
shift 2 |
||||
;; |
||||
--host=*) |
||||
HOST="${1#*=}" |
||||
shift 1 |
||||
;; |
||||
-p) |
||||
PORT="$2" |
||||
if [[ $PORT == "" ]]; then break; fi |
||||
shift 2 |
||||
;; |
||||
--port=*) |
||||
PORT="${1#*=}" |
||||
shift 1 |
||||
;; |
||||
-t) |
||||
TIMEOUT="$2" |
||||
if [[ $TIMEOUT == "" ]]; then break; fi |
||||
shift 2 |
||||
;; |
||||
--timeout=*) |
||||
TIMEOUT="${1#*=}" |
||||
shift 1 |
||||
;; |
||||
--) |
||||
shift |
||||
CLI="$@" |
||||
break |
||||
;; |
||||
--help) |
||||
usage |
||||
;; |
||||
*) |
||||
echoerr "Unknown argument: $1" |
||||
usage |
||||
;; |
||||
esac |
||||
done |
||||
|
||||
if [[ "$HOST" == "" || "$PORT" == "" ]]; then |
||||
echoerr "Error: you need to provide a host and port to test." |
||||
usage |
||||
fi |
||||
|
||||
TIMEOUT=${TIMEOUT:-15} |
||||
STRICT=${STRICT:-0} |
||||
CHILD=${CHILD:-0} |
||||
QUIET=${QUIET:-0} |
||||
|
||||
if [[ $CHILD -gt 0 ]]; then |
||||
wait_for |
||||
RESULT=$? |
||||
exit $RESULT |
||||
else |
||||
if [[ $TIMEOUT -gt 0 ]]; then |
||||
wait_for_wrapper |
||||
RESULT=$? |
||||
else |
||||
wait_for |
||||
RESULT=$? |
||||
fi |
||||
fi |
||||
|
||||
if [[ $CLI != "" ]]; then |
||||
if [[ $RESULT -ne 0 && $STRICT -eq 1 ]]; then |
||||
echoerr "$cmdname: strict mode, refusing to execute subprocess" |
||||
exit $RESULT |
||||
fi |
||||
exec $CLI |
||||
else |
||||
exit $RESULT |
||||
fi |
Loading…
Reference in new issue