#!/usr/bin/env sh # Configurable Variables [ -z $DOCKER_SOCK_PATH ] && DOCKER_SOCK_PATH="/tmp/docker.sock" [ -z $NETWORK_NAME ] && NETWORK_NAME="proxy" [ -z $RESOLVE_DOCKERHOST ] && RESOLVE_DOCKERHOST=false [ -z $HOST_CONF_PATH ] && HOST_CONF_PATH="/tmp/hosts" [ -z $DOCKER_HOSTNAME_VAR ] && DOCKER_HOSTNAME_VAR="VIRTUAL_HOST" query_docker () { curl --unix-socket $DOCKER_SOCK_PATH --silent -g http://v1.41/$1$2 } get_host_list() { PROXY_HOST_CONF="" CONTAINER_LIST=$(query_docker "containers/json" "?filters={%22network%22:[%22${NETWORK_NAME}%22],%22status%22:[%22running%22]}" | jq -cr '.[].Id') for id in $CONTAINER_LIST do # Query individual container to access relevant data CONTAINER_DATA=$(query_docker "containers/${id}/json") if $RESOLVE_DOCKERHOST then HOST_IP=$(echo $CONTAINER_DATA | jq -cr '.NetworkSettings.Networks.proxy.IPAddress') else HOST_IP="127.0.0.1" fi # Filter Env for HOSTNAME, remove list parenthesis and split/only keep values HOST_NAMES=$(echo $CONTAINER_DATA | jq -cr ".Config.Env[] | select(contains(\"$DOCKER_HOSTNAME_VAR=\")) | split(\"=\")[1]") for hostname in $HOST_NAMES do PROXY_HOST_CONF="$PROXY_HOST_CONF\n$HOST_IP $hostname # Added by hostman" done done echo $PROXY_HOST_CONF } update_host_list() { FILTERED_HOSTS=$(grep -ve "# Added by hostman$" $HOST_CONF_PATH) echo -e "$FILTERED_HOSTS$(get_host_list)" > $HOST_CONF_PATH } update_host_list # cannot filter because reailine no longer recognized lines otherwise (check how IFS changes) query_docker "events" | while true do read -r; # wait for related events to finish while [ $? -eq 0 ] do read -t 5 -r; done update_host_list done