From 3f0f581507db842596ca925811c18d2d99fca63e Mon Sep 17 00:00:00 2001 From: Elly Dameki Date: Fri, 7 Aug 2026 17:25:17 -0400 Subject: [PATCH 1/4] fdb.bash now supports selecting between ipv4 and ipv6 Public IP is the first IP in `hostname -I` of the correct version, unless `hostname -i` resolves to the correct IP version. --- packaging/docker/Dockerfile | 1 + packaging/docker/fdb.bash | 55 ++++++++++++++++++++++++++++++------- 2 files changed, 46 insertions(+), 10 deletions(-) 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..1be7985bc9d 100755 --- a/packaging/docker/fdb.bash +++ b/packaging/docker/fdb.bash @@ -54,32 +54,67 @@ 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 PUBLIC_IP4=127.0.0.1 + export PUBLIC_IP6="[::1]" elif [[ "$FDB_NETWORKING_MODE" == "container" ]]; then - public_ip=$(hostname -i | awk '{print $1}') + my_hostname=$(hostname -i) + if [[ "$my_hostname" == *'.'* ]]; then + export PUBLIC_IP4="$my_hostname" + elif [[ "$my_hostname" == *':'* ]]; then + export PUBLIC_IP6="[$my_hostname]" + fi + + for addr in $(hostname -I); do + if [[ -z "$PUBLIC_IP4" && $addr == *'.'* ]]; then + export PUBLIC_IP4="$addr" + elif [[ -z "$PUBLIC_IP6" && $addr == *':'* ]]; then + export PUBLIC_IP6="[$addr]" + elif [[ (! -z "$PUBLIC_IP4") && (! -z "$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} + + discover_network_environment + + if [[ "$FDB_IP_VERSION" == *'4'* ]]; then + export LISTEN_IP='0.0.0.0' + export PUBLIC_IP="$PUBLIC_IP4" + elif [[ "$FDB_IP_VERSION" == *'6'* ]]; then + export LISTEN_IP='[::]' + export PUBLIC_IP="$PUBLIC_IP6" + else + echo "Unknown FDB IP version \"$FDB_IP_VERSION\"" 1>&2 + exit 1 + fi + + if [[ -z $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@$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 $PUBLIC_IP:$FDB_PORT, listening on $LISTEN_IP:$FDB_PORT" +fdbserver --listen-address $LISTEN_IP:"$FDB_PORT" --public-address "$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 \ "$@" From 5cb5471c11b4704af4acc810e048f533d65b00df Mon Sep 17 00:00:00 2001 From: Elly Dameki Date: Fri, 7 Aug 2026 17:49:19 -0400 Subject: [PATCH 2/4] Change coordinator ip discovery to be dependent on IP stack --- packaging/docker/fdb.bash | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packaging/docker/fdb.bash b/packaging/docker/fdb.bash index 1be7985bc9d..2c72deec7ee 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 From b07882d1f84ca2ac5125f3577f2b2f23d1caeda8 Mon Sep 17 00:00:00 2001 From: Elly Dameki Date: Sat, 8 Aug 2026 10:15:29 -0400 Subject: [PATCH 3/4] fixed `fdb.bash` not selecting first IP in event FDB_COORDINATOR resolves to multiple IPs --- packaging/docker/fdb.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/docker/fdb.bash b/packaging/docker/fdb.bash index 2c72deec7ee..1b6796776b9 100755 --- a/packaging/docker/fdb.bash +++ b/packaging/docker/fdb.bash @@ -64,7 +64,7 @@ function discover_network_environment() { export PUBLIC_IP4=127.0.0.1 export PUBLIC_IP6="[::1]" elif [[ "$FDB_NETWORKING_MODE" == "container" ]]; then - my_hostname=$(hostname -i) + my_hostname=$(hostname -i | awk '{print $1}') if [[ "$my_hostname" == *'.'* ]]; then export PUBLIC_IP4="$my_hostname" elif [[ "$my_hostname" == *':'* ]]; then From 655f88c47abbd04f5c392405ea2ff5d2e806a2ee Mon Sep 17 00:00:00 2001 From: Elly Dameki Date: Mon, 10 Aug 2026 06:57:13 -0400 Subject: [PATCH 4/4] Better shell quoting of listen address --- packaging/docker/fdb.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/docker/fdb.bash b/packaging/docker/fdb.bash index 1b6796776b9..c1747cb860e 100755 --- a/packaging/docker/fdb.bash +++ b/packaging/docker/fdb.bash @@ -119,7 +119,7 @@ function create_server_environment() { create_server_environment echo "Starting FDB server on $PUBLIC_IP:$FDB_PORT, listening on $LISTEN_IP:$FDB_PORT" -fdbserver --listen-address $LISTEN_IP:"$FDB_PORT" --public-address "$PUBLIC_IP:$FDB_PORT" \ +fdbserver --listen-address "$LISTEN_IP:$FDB_PORT" --public-address "$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 \ "$@"