From 0ea8bfaf78ba633b5951fa1d9c604b3b50a4dd62 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Thu, 4 May 2017 00:48:13 -0700 Subject: [PATCH] Add waiting on hosts in docker entrypoint for distributed setups. (#4244) Thanks to Remco Verhoef for the script. Fixes #4225 --- buildscripts/docker-entrypoint.sh | 48 +++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/buildscripts/docker-entrypoint.sh b/buildscripts/docker-entrypoint.sh index 6f893c069..52ca80972 100755 --- a/buildscripts/docker-entrypoint.sh +++ b/buildscripts/docker-entrypoint.sh @@ -15,15 +15,50 @@ # limitations under the License. # -# if command starts with an option, prepend minio +# If command starts with an option, prepend minio. if [ "${1}" != "minio" ]; then if [ -n "${1}" ]; then set -- minio "$@" fi fi -## Look for swarm secrets in default location. -file_env() { +# Wait for all the hosts to come online and have +# their DNS entries populated properly. +docker_wait_hosts() { + hosts="$@" + num_hosts=0 + # Count number of hosts in arguments. + for host in $hosts; do + [ $(echo "$host" | grep -E "^http") ] || continue + num_hosts=$((num_hosts+1)) + done + if [ $num_hosts -gt 0 ]; then + echo -n "Waiting for all hosts to resolve..." + while true; do + x=0 + for host in $hosts; do + [ $(echo "$host" | grep -E "^http") ] || continue + # Extract the domain. + host=$(echo $host | sed -e 's/^http[s]\?:\/\/\([^\/]\+\).*/\1/') + echo -n . + val=$(ping -c 1 $host 2>/dev/null) + if [ $? != 0 ]; then + echo "Failed to lookup $host" + continue + fi + x=$((x+1)) + done + # Provided hosts same as successful hosts, should break out. + test $x -eq $num_hosts && break + echo "Failed to resolve hosts.. retrying after 1 second." + sleep 1 + done + echo "All hosts are resolving proceeding to initialize Minio." + fi +} + +## Look for docker secrets in default documented location. +docker_secrets_env() { local MINIO_ACCESS_KEY_FILE="/run/secrets/access_key" local MINIO_SECRET_KEY_FILE="/run/secrets/secret_key" @@ -37,7 +72,10 @@ file_env() { fi } -## Set env if necessary. -file_env +## Set access env from secrets if necessary. +docker_secrets_env + +## Wait for all the hosts to come online. +docker_wait_hosts "$@" exec "$@"