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 }