From c5a90a7d440cd3949f5861ee634d9c2d37e335f5 Mon Sep 17 00:00:00 2001 From: Tymoteusz Czech <2625371+Tymek@users.noreply.github.com> Date: Thu, 16 Feb 2023 12:50:32 +0100 Subject: [PATCH] refactor: docker wait for db with condition (#3101) --- docker-compose.yml | 16 +++- scripts/wait-for | 191 --------------------------------------------- 2 files changed, 12 insertions(+), 195 deletions(-) delete mode 100755 scripts/wait-for diff --git a/docker-compose.yml b/docker-compose.yml index a181f705b5..2e5a12c624 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -36,10 +36,11 @@ services: # comma (`token1,token2`). INIT_CLIENT_API_TOKENS: "default:development.unleash-insecure-api-token" depends_on: - - db + db: + condition: service_healthy volumes: - ./scripts:/scripts - command: ["/scripts/wait-for", "db:5432", "--", "node", "index.js"] + command: [ "node", "index.js" ] healthcheck: test: wget --no-verbose --tries=1 --spider http://localhost:4242/health || exit 1 interval: 1s @@ -56,8 +57,15 @@ services: # trust incoming connections blindly (DON'T DO THIS IN PRODUCTION!) POSTGRES_HOST_AUTH_METHOD: "trust" healthcheck: - test: ["CMD", "pg_isready", "--username=postgres", "--host=127.0.0.1", "--port=5432"] + test: + [ + "CMD", + "pg_isready", + "--username=postgres", + "--host=127.0.0.1", + "--port=5432" + ] interval: 2s timeout: 1m retries: 5 - start_period: 10s \ No newline at end of file + start_period: 10s diff --git a/scripts/wait-for b/scripts/wait-for deleted file mode 100755 index 97355ee0c2..0000000000 --- a/scripts/wait-for +++ /dev/null @@ -1,191 +0,0 @@ -#!/bin/sh - -# The MIT License (MIT) -# -# Copyright (c) 2017 Eficode Oy -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -VERSION="2.2.3" - -set -- "$@" -- "$TIMEOUT" "$QUIET" "$PROTOCOL" "$HOST" "$PORT" "$result" -TIMEOUT=15 -QUIET=0 -# The protocol to make the request with, either "tcp" or "http" -PROTOCOL="tcp" - -echoerr() { - if [ "$QUIET" -ne 1 ]; then printf "%s\n" "$*" 1>&2; fi -} - -usage() { - exitcode="$1" - cat << USAGE >&2 -Usage: - $0 host:port|url [-t timeout] [-- command args] - -q | --quiet Do not output any status messages - -t TIMEOUT | --timeout=timeout Timeout in seconds, zero for no timeout - -v | --version Show the version of this tool - -- COMMAND ARGS Execute command with args after the test finishes -USAGE - exit "$exitcode" -} - -wait_for() { - case "$PROTOCOL" in - tcp) - if ! command -v nc >/dev/null; then - echoerr 'nc command is missing!' - exit 1 - fi - ;; - http) - if ! command -v wget >/dev/null; then - echoerr 'wget command is missing!' - exit 1 - fi - ;; - esac - - TIMEOUT_END=$(($(date +%s) + TIMEOUT)) - - while :; do - case "$PROTOCOL" in - tcp) - nc -w 1 -z "$HOST" "$PORT" > /dev/null 2>&1 - ;; - http) - wget --timeout=1 -q "$HOST" -O /dev/null > /dev/null 2>&1 - ;; - *) - echoerr "Unknown protocol '$PROTOCOL'" - exit 1 - ;; - esac - - result=$? - - if [ $result -eq 0 ] ; then - if [ $# -gt 7 ] ; then - for result in $(seq $(($# - 7))); do - result=$1 - shift - set -- "$@" "$result" - done - - TIMEOUT=$2 QUIET=$3 PROTOCOL=$4 HOST=$5 PORT=$6 result=$7 - shift 7 - exec "$@" - fi - exit 0 - fi - - if [ $TIMEOUT -ne 0 -a $(date +%s) -ge $TIMEOUT_END ]; then - echo "Operation timed out" >&2 - exit 1 - fi - - sleep 1 - done -} - -while :; do - case "$1" in - http://*|https://*) - HOST="$1" - PROTOCOL="http" - shift 1 - ;; - *:* ) - HOST=$(printf "%s\n" "$1"| cut -d : -f 1) - PORT=$(printf "%s\n" "$1"| cut -d : -f 2) - shift 1 - ;; - -v | --version) - echo $VERSION - exit - ;; - -q | --quiet) - QUIET=1 - shift 1 - ;; - -q-*) - QUIET=0 - echoerr "Unknown option: $1" - usage 1 - ;; - -q*) - QUIET=1 - result=$1 - shift 1 - set -- -"${result#-q}" "$@" - ;; - -t | --timeout) - TIMEOUT="$2" - shift 2 - ;; - -t*) - TIMEOUT="${1#-t}" - shift 1 - ;; - --timeout=*) - TIMEOUT="${1#*=}" - shift 1 - ;; - --) - shift - break - ;; - --help) - usage 0 - ;; - -*) - QUIET=0 - echoerr "Unknown option: $1" - usage 1 - ;; - *) - QUIET=0 - echoerr "Unknown argument: $1" - usage 1 - ;; - esac -done - -if ! [ "$TIMEOUT" -ge 0 ] 2>/dev/null; then - echoerr "Error: invalid timeout '$TIMEOUT'" - usage 3 -fi - -case "$PROTOCOL" in - tcp) - if [ "$HOST" = "" ] || [ "$PORT" = "" ]; then - echoerr "Error: you need to provide a host and port to test." - usage 2 - fi - ;; - http) - if [ "$HOST" = "" ]; then - echoerr "Error: you need to provide a host to test." - usage 2 - fi - ;; -esac - -wait_for "$@" \ No newline at end of file