diff --git a/packaging/docker/Dockerfile b/packaging/docker/Dockerfile index 6771676ae5b..682b5907841 100644 --- a/packaging/docker/Dockerfile +++ b/packaging/docker/Dockerfile @@ -199,6 +199,7 @@ ENV FDB_COORDINATOR="" ENV FDB_COORDINATOR_PORT=4500 ENV FDB_CLUSTER_FILE_CONTENTS="" ENV FDB_PROCESS_CLASS=unset +ENV FDB_IP_VERSION=4 ENTRYPOINT ["/usr/bin/tini", "-g", "--", "/var/fdb/scripts/fdb.bash"] FROM foundationdb-base AS mako diff --git a/packaging/docker/fdb.bash b/packaging/docker/fdb.bash index 086b08545dc..a1eb7ecf27c 100755 --- a/packaging/docker/fdb.bash +++ b/packaging/docker/fdb.bash @@ -25,7 +25,12 @@ function create_cluster_file() { mkdir -p "$(dirname $FDB_CLUSTER_FILE)" if [[ -n $FDB_COORDINATOR ]]; then - coordinator_ip=$(dig +short "$FDB_COORDINATOR") + if [[ "$FDB_IP_VERSION" == *'4'* ]]; then + coordinator_ip="$(getent ahostsv4 $FDB_COORDINATOR | awk 'END{ print $1 }')" + elif [[ "$FDB_IP_VERSION" == *'6'* ]]; then + coordinator_ip="[$(getent ahostsv6 $FDB_COORDINATOR | awk 'END{ print $1 }')]" + fi + if [[ -z "$coordinator_ip" ]]; then echo "Failed to look up coordinator address for $FDB_COORDINATOR" 1>&2 exit 1 @@ -54,32 +59,62 @@ function create_cluster_file() { fi } -function create_server_environment() { - env_file=/var/fdb/.fdbenv - +function discover_network_environment() { if [[ "$FDB_NETWORKING_MODE" == "host" ]]; then - public_ip=127.0.0.1 + export FDB_PUBLIC_IP4=127.0.0.1 + export FDB_PUBLIC_IP6="[::1]" elif [[ "$FDB_NETWORKING_MODE" == "container" ]]; then - public_ip=$(hostname -i | awk '{print $1}') + for addr in $(hostname -I); do + if [[ -z "$FDB_PUBLIC_IP4" && $addr == *'.'* ]]; then + export FDB_PUBLIC_IP4="$addr" + elif [[ -z "$FDB_PUBLIC_IP6" && $addr == *':'* ]]; then + export FDB_PUBLIC_IP6="[$addr]" + elif [[ (! -z "$FDB_PUBLIC_IP4") && (! -z "$FDB_PUBLIC_IP6") ]]; then + break + fi + done else echo "Unknown FDB Networking mode \"$FDB_NETWORKING_MODE\"" 1>&2 exit 1 fi +} + +function create_server_environment() { + FDB_IP_VERSION=${FDB_IP_VERSION:-v4} + + if [[ -z "$FDB_PUBLIC_IP" ]]; then + discover_network_environment + fi + + if [[ "$FDB_IP_VERSION" == *'4'* ]]; then + export FDB_LISTEN_IP=${FDB_LISTEN_IP:-'0.0.0.0'} + export FDB_PUBLIC_IP=${FDB_PUBLIC_IP:-$FDB_PUBLIC_IP4} + elif [[ "$FDB_IP_VERSION" == *'6'* ]]; then + export FDB_LISTEN_IP=${FDB_LISTEN_IP:-'[::]'} + export FDB_PUBLIC_IP=${FDB_PUBLIC_IP:-$FDB_PUBLIC_IP6} + else + echo "Unknown FDB IP version \"$FDB_IP_VERSION\"" 1>&2 + exit 1 + fi + + if [[ -z $FDB_PUBLIC_IP ]]; then + echo "No valid IP for IP version \"$FDB_IP_VERSION\"" 1>&2 + exit 1 + fi + - echo "export PUBLIC_IP=$public_ip" > $env_file # Set default cluster file contents only if no other configuration is specified. if [[ (! -s "$FDB_CLUSTER_FILE") && -z "$FDB_CLUSTER_FILE_CONTENTS" && -z "$FDB_COORDINATOR" ]]; then echo "Warning: No configuration available, falling back to self-coordinated." 1>&2 - FDB_CLUSTER_FILE_CONTENTS="docker:docker@$public_ip:$FDB_PORT" + FDB_CLUSTER_FILE_CONTENTS="docker:docker@$FDB_PUBLIC_IP:$FDB_PORT" fi create_cluster_file } create_server_environment -source /var/fdb/.fdbenv -echo "Starting FDB server on $PUBLIC_IP:$FDB_PORT" -fdbserver --listen-address 0.0.0.0:"$FDB_PORT" --public-address "$PUBLIC_IP:$FDB_PORT" \ +echo "Starting FDB server on $FDB_PUBLIC_IP:$FDB_PORT, listening on $FDB_LISTEN_IP:$FDB_PORT" +fdbserver --listen-address "$FDB_LISTEN_IP:$FDB_PORT" --public-address "$FDB_PUBLIC_IP:$FDB_PORT" \ --datadir /var/fdb/data --logdir /var/fdb/logs \ --locality-zoneid="$(hostname)" --locality-machineid="$(hostname)" --class "$FDB_PROCESS_CLASS" --knob_disable_posix_kernel_aio=1 \ "$@"