From 14e6d4aba1a27dc3219529dadb846a25f9eafbe9 Mon Sep 17 00:00:00 2001 From: librelad Date: Tue, 2 Jun 2026 15:02:36 +0100 Subject: [PATCH] fix(network): converge when the docker network already exists MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit installDockerNetwork errored with 'network with name already exists' on re-runs: the requirement check sets DOCKER_NETWORK_SETUP_NEEDED=true whenever 'docker network inspect' returns non-zero, but that also happens when the rootless daemon socket isn't reachable yet — indistinguishable from the network being genuinely absent. A prior install also leaves the network behind, so the flag fires on every re-install. Re-check existence right before creating and converge: if the network is already there, leave it in place and adopt its real subnet into CFG rather than erroring. This also stops the spurious subnet randomization (and the resulting CFG drift) that ran before the doomed create. Co-Authored-By: Claude Opus 4.8 --- scripts/docker/network/network_setup.sh | 54 ++++++++++++++++--------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/scripts/docker/network/network_setup.sh b/scripts/docker/network/network_setup.sh index b57b046..f7fa7f6 100755 --- a/scripts/docker/network/network_setup.sh +++ b/scripts/docker/network/network_setup.sh @@ -1,34 +1,50 @@ #!/bin/bash -installDockerNetwork() +installDockerNetwork() { - # Check if network setup is needed - if [[ "$DOCKER_NETWORK_SETUP_NEEDED" == "true" ]]; then - isHeader "Create a Docker Network" + if [[ "$DOCKER_NETWORK_SETUP_NEEDED" != "true" ]]; then + isNotice "Docker network $CFG_NETWORK_NAME already exists or setup not needed" + return 0 + fi - isNotice "Network $CFG_NETWORK_NAME not found, creating now" + isHeader "Create a Docker Network" - # Check if we need to generate a new subnet - updateDockerNetworkSubnet + # Re-check existence right before creating, and converge instead of erroring + # if it's already there. The requirement check that set + # DOCKER_NETWORK_SETUP_NEEDED can run before the rootless daemon socket is + # reachable (a failed inspect is indistinguishable from "network absent"), and + # a previous install leaves the network behind — both make us think it's new + # when it isn't. If it exists, leave it in place and adopt its real subnet so + # CFG stays in step with docker (and we don't randomize to a subnet we can't apply). + if dockerCommandRun "docker network inspect $CFG_NETWORK_NAME > /dev/null 2>&1"; then + local current_subnet; current_subnet=$(dockerCommandRun "docker network inspect $CFG_NETWORK_NAME --format '{{range .IPAM.Config}}{{.Subnet}}{{end}}' 2>/dev/null") + isNotice "Docker network $CFG_NETWORK_NAME already exists, leaving it in place" + if [[ -n "$current_subnet" && "$current_subnet" != "$CFG_NETWORK_SUBNET" ]]; then + adoptDockerSubnet "$current_subnet" + fi + return 0 + fi - # Create the Docker network command - local network_create="docker network create \ + isNotice "Network $CFG_NETWORK_NAME not found, creating now" + + # Check if we need to generate a new subnet + updateDockerNetworkSubnet + + # Create the Docker network command + local network_create="docker network create \ --driver=bridge \ --subnet=$CFG_NETWORK_SUBNET \ --ip-range=${CFG_NETWORK_SUBNET%.*}.0/24 \ --gateway=${CFG_NETWORK_SUBNET%.*}.1 \ --opt com.docker.network.bridge.name=$CFG_NETWORK_NAME \ $CFG_NETWORK_NAME" - - # Run the network creation command - local result; result=$(dockerCommandRun "$network_create") - if [[ $? -eq 0 ]]; then - checkSuccess "Docker network $CFG_NETWORK_NAME created successfully" - else - isError "Failed to create Docker network $CFG_NETWORK_NAME" - isError " $result" - fi + + # Run the network creation command + local result; result=$(dockerCommandRun "$network_create") + if [[ $? -eq 0 ]]; then + checkSuccess "Docker network $CFG_NETWORK_NAME created successfully" else - isNotice "Docker network $CFG_NETWORK_NAME already exists or setup not needed" + isError "Failed to create Docker network $CFG_NETWORK_NAME" + isError " $result" fi }