Skip to content

Commit bf8775e

Browse files
Implement active polling for Docker startup readiness (#71)
* Implement active polling for Docker startup readiness Replaces fixed sleep delays with active polling loops to ensure Docker and containerd are fully ready before proceeding. Updates run.sh and test-script.sh to address the 'two runs needed' bug, adds a dedicated test for Docker startup polling, and expands bug fix test coverage. * Fix variable expansion in mock docker script heredoc Changed the heredoc delimiter in the mock docker script to allow variable expansion, ensuring the correct state file path is used. Removed the need for a post-processing sed command. * Update script version to 2025.12.0 Bump displayed version number from 2025.11.1 to 2025.12.0 in all relevant echo statements within run.sh.
1 parent a70b129 commit bf8775e

2 files changed

Lines changed: 320 additions & 21 deletions

File tree

casaos-fix-docker-api-version/run.sh

Lines changed: 79 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ print_info() {
5959
}
6060

6161
echo "=========================================="
62-
echo "BigBear CasaOS Docker Version Fix Script 2025.11.1"
62+
echo "BigBear CasaOS Docker Version Fix Script 2025.12.0"
6363
echo "=========================================="
6464
echo ""
6565
echo "Here are some links:"
@@ -595,16 +595,30 @@ EOF
595595
# Reload systemd daemon
596596
echo "Reloading systemd daemon..."
597597
$SUDO systemctl daemon-reload
598+
sleep 2
598599
echo ""
599600

600601
# Restart Docker
601602
echo "Restarting Docker service..."
602603
timeout 30 $SUDO systemctl restart docker
603-
sleep 3
604+
605+
# Wait for Docker to be fully ready with active polling
606+
echo "Waiting for Docker to be fully ready..."
607+
local docker_ready=false
608+
for i in {1..10}; do
609+
if $SUDO systemctl is-active --quiet docker 2>/dev/null; then
610+
if timeout 5 $SUDO docker info >/dev/null 2>&1; then
611+
docker_ready=true
612+
break
613+
fi
614+
fi
615+
echo " Waiting for Docker... ($i/10)"
616+
sleep 2
617+
done
604618
echo ""
605619

606620
# Verify Docker is running
607-
if $SUDO systemctl is-active --quiet docker; then
621+
if [ "$docker_ready" = true ] || $SUDO systemctl is-active --quiet docker; then
608622
echo "✓ Docker service restarted successfully"
609623

610624
# Show current Docker info
@@ -651,15 +665,29 @@ remove_docker_api_override() {
651665
# Reload systemd daemon
652666
echo "Reloading systemd daemon..."
653667
$SUDO systemctl daemon-reload
668+
sleep 2
654669
echo ""
655670

656671
# Restart Docker
657672
echo "Restarting Docker service..."
658673
timeout 30 $SUDO systemctl restart docker
659-
sleep 3
674+
675+
# Wait for Docker to be fully ready with active polling
676+
echo "Waiting for Docker to be fully ready..."
677+
local docker_ready=false
678+
for i in {1..10}; do
679+
if $SUDO systemctl is-active --quiet docker 2>/dev/null; then
680+
if timeout 5 $SUDO docker info >/dev/null 2>&1; then
681+
docker_ready=true
682+
break
683+
fi
684+
fi
685+
echo " Waiting for Docker... ($i/10)"
686+
sleep 2
687+
done
660688
echo ""
661689

662-
if $SUDO systemctl is-active --quiet docker; then
690+
if [ "$docker_ready" = true ] || $SUDO systemctl is-active --quiet docker; then
663691
echo "✓ Docker API override removed successfully"
664692
echo ""
665693
return 0
@@ -1230,40 +1258,77 @@ downgrade_docker() {
12301258
# Reload systemd and restart Docker service
12311259
echo "Reloading systemd daemon..."
12321260
$SUDO systemctl daemon-reload
1261+
# Wait for systemd to fully process the reload
1262+
sleep 2
12331263
echo ""
12341264

12351265
# Ensure Docker is completely stopped before starting
12361266
echo "Step 7.2: Ensuring Docker is completely stopped..."
12371267
timeout 30 $SUDO systemctl stop docker.socket 2>/dev/null || true
12381268
timeout 30 $SUDO systemctl stop docker 2>/dev/null || true
1239-
sleep 2
1269+
sleep 3
12401270

12411271
# Use the new function to ensure processes are stopped
12421272
ensure_docker_processes_stopped
12431273

12441274
# Stop containerd to ensure clean slate
12451275
echo "Restarting containerd for clean state..."
12461276
timeout 30 $SUDO systemctl stop containerd 2>/dev/null || true
1247-
sleep 1
1277+
sleep 2
12481278
if pgrep -x containerd >/dev/null 2>&1; then
12491279
$SUDO pkill -9 containerd 2>/dev/null || true
1250-
sleep 1
1280+
sleep 2
12511281
fi
12521282
$SUDO systemctl start containerd 2>/dev/null || true
1253-
sleep 2
1283+
1284+
# Wait for containerd to be fully ready before starting Docker
1285+
echo "Waiting for containerd to be fully ready..."
1286+
local containerd_ready=false
1287+
for i in {1..10}; do
1288+
if $SUDO systemctl is-active --quiet containerd 2>/dev/null; then
1289+
containerd_ready=true
1290+
echo "✓ containerd is ready"
1291+
break
1292+
fi
1293+
echo " Waiting for containerd... ($i/10)"
1294+
sleep 1
1295+
done
1296+
1297+
if [ "$containerd_ready" = false ]; then
1298+
echo "⚠ WARNING: containerd may not be fully ready, proceeding anyway..."
1299+
fi
12541300
echo ""
12551301

12561302
# Enable and start docker socket first, then service
12571303
echo "Step 7.3: Enabling and starting Docker socket..."
12581304
$SUDO systemctl enable docker.socket 2>/dev/null || true
12591305
$SUDO systemctl start docker.socket
1260-
sleep 1
1306+
sleep 2
12611307
echo ""
12621308

12631309
echo "Step 7.4: Enabling and starting Docker service..."
12641310
$SUDO systemctl enable docker
12651311
$SUDO systemctl start docker
1266-
sleep 5 # Give Docker more time to fully initialize
1312+
1313+
# Wait for Docker to be fully ready with active polling instead of fixed sleep
1314+
echo "Waiting for Docker to be fully ready..."
1315+
local docker_ready=false
1316+
for i in {1..15}; do
1317+
if $SUDO systemctl is-active --quiet docker 2>/dev/null; then
1318+
# Double-check that Docker is actually responding
1319+
if timeout 5 $SUDO docker info >/dev/null 2>&1; then
1320+
docker_ready=true
1321+
echo "✓ Docker is ready and responding"
1322+
break
1323+
fi
1324+
fi
1325+
echo " Waiting for Docker... ($i/15)"
1326+
sleep 2
1327+
done
1328+
1329+
if [ "$docker_ready" = false ]; then
1330+
echo "⚠ Docker may not be fully ready after 30 seconds..."
1331+
fi
12671332
echo ""
12681333

12691334
# Verify Docker is running
@@ -1573,23 +1638,23 @@ main() {
15731638
case "$1" in
15741639
apply-override|override)
15751640
echo "=========================================="
1576-
echo "BigBear CasaOS Docker Version Fix Script 2025.11.1"
1641+
echo "BigBear CasaOS Docker Version Fix Script 2025.12.0"
15771642
echo "=========================================="
15781643
echo ""
15791644
apply_docker_api_override
15801645
exit $?
15811646
;;
15821647
remove-override|no-override)
15831648
echo "=========================================="
1584-
echo "BigBear CasaOS Docker Version Fix Script 2025.11.1"
1649+
echo "BigBear CasaOS Docker Version Fix Script 2025.12.0"
15851650
echo "=========================================="
15861651
echo ""
15871652
remove_docker_api_override
15881653
exit $?
15891654
;;
15901655
help|--help|-h)
15911656
echo "=========================================="
1592-
echo "BigBear CasaOS Docker Version Fix Script 2025.11.1"
1657+
echo "BigBear CasaOS Docker Version Fix Script 2025.12.0"
15931658
echo "=========================================="
15941659
echo ""
15951660
show_usage

0 commit comments

Comments
 (0)