From fea23e64a746e72834ccacc690aa9d7ee78c4b01 Mon Sep 17 00:00:00 2001 From: Valentin Lab Date: Mon, 20 Jun 2016 17:10:24 +0200 Subject: [PATCH] new: added ``get_docker_ip``, ``wait_docker_ip``, ``docker_add_host_declaration``. --- bin/compose | 95 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 63 insertions(+), 32 deletions(-) diff --git a/bin/compose b/bin/compose index de62d08..54a8c91 100755 --- a/bin/compose +++ b/bin/compose @@ -569,43 +569,74 @@ dcmd () { } export -f dcmd + +get_docker_ip() { + local name="$1" + docker inspect --format='{{.NetworkSettings.IPAddress}}' "$name" 2>/dev/null +} +export -f get_docker_ip + +wait_docker_ip() { + local name="$1" timeout="${2:-15}" timeout_count=0 docker_ip= + start=$SECONDS + while [ -z "$docker_ip" ]; do + sleep 0.5 + docker_ip=$(get_docker_ip "$name") && break + elapsed=$((SECONDS - start)) + if ((elapsed > timeout)); then + err "${RED}timeout error${NORMAL}(${timeout}s):" \ + "Could not find '$name' docker container's IP." + return 1 + fi + [ "$elapsed" == "$old_elapsed" ] || + verb "Waiting for docker $name... ($elapsed/$timeout)" + old_elapsed="$elapsed" + done + verb "Found docker $name IP: $docker_ip" + echo "$docker_ip" +} +export -f wait_docker_ip + ## Warning: requires a ``ddb`` matching current database to be checked wait_for_docker_ip() { - local name=$1 timeout=5 timeout_count=0 DOCKER_IP= DB_OK= - while [ -z "$DOCKER_IP" ]; do - sleep 1 - DOCKER_IP=$(docker inspect --format='{{.NetworkSettings.IPAddress}}' "$name" 2>/dev/null) - verb "[1/2] Waiting for docker $name... ($[timeout_count + 1]/$timeout)" - ((timeout_count++)) || true - if [ "$timeout_count" == "$timeout" ]; then - err "${RED}timeout error${NORMAL}(${timeout}s):"\ - "Could not find '$name' docker" \ - "container's IP." - return 1 - fi - done - verb "[1/2] Found docker $name IP: $DOCKER_IP" - timeout_count=0 - DB_OK= - _set_db_params "$DOCKER_IP" - while [ -z "$DB_OK" ]; do - sleep 1 - echo "SELECT 1;" | ddb >/dev/null && DB_OK=1 - verb "[2/2] Waiting for db service from docker $name... ($[timeout_count + 1]/$timeout)" - ((timeout_count++)) || true - if [ "$timeout_count" == "$timeout" ]; then - err "${RED}timeout error${NORMAL}(${timeout}s):"\ - "Could not connect to db on $DOCKER_IP." \ - "container's IP." - return 1 - fi - done - verb "[2/2] Db is ready !" - echo "$DOCKER_IP" - return 0 + local name=$1 timeout=5 timeout_count=0 DOCKER_IP= DB_OK= + DOCKER_IP=$(wait_docker_ip "$name" 5) || return 1 + timeout_count=0 + DB_OK= + _set_db_params "$DOCKER_IP" + while [ -z "$DB_OK" ]; do + sleep 1 + echo "SELECT 1;" | ddb >/dev/null && DB_OK=1 + verb "[2/2] Waiting for db service from docker $name... ($[timeout_count + 1]/$timeout)" + ((timeout_count++)) || true + if [ "$timeout_count" == "$timeout" ]; then + err "${RED}timeout error${NORMAL}(${timeout}s):"\ + "Could not connect to db on $DOCKER_IP." \ + "container's IP." + return 1 + fi + done + verb "[2/2] Db is ready !" + echo "$DOCKER_IP" + return 0 } export -f wait_for_docker_ip + +docker_add_host_declaration() { + local src_docker=$1 domain=$2 dst_docker=$3 dst_docker_ip= + dst_docker_ip=$(wait_docker_ip "$dst_docker") || exit 1 + docker exec -i "$src_docker" bash < /dev/null 2>&1; then + sed -ri "s/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\s+$domain\$/$dst_docker_ip $domain/g" /etc/hosts + else + echo "$dst_docker_ip $domain" >> /etc/hosts + fi +EOF +} +export -f docker_add_host_declaration + + ## ## Arrays ##