[BUG: minor] devshard-gateway healthcheck uses curl, which the image does not contain → container permanently unhealthy #2085

Open @maria-mitina opened 2026-10-22 11:17 UTC 0 comments Updated 2026-10-22 11:18 UTC

Summary

deploy/join/docker-compose.devshard-gateway.yml defines the gateway healthcheck as

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:8080/v1/status"]

but the image it runs (devshardctl-runtime stage in devshard/Dockerfile) is alpine:3.23 with only ca-certificates wget installed — no curl. Every gateway started from the stock compose therefore reports unhealthy forever.

Observed

  • testnet1 gateway (devshard-gateway:testnet-v6-f5ad27a): docker ps → Up 8 days (unhealthy), FailingStreak=23034, health log: OCI runtime exec failed: exec: "curl": executable file not found in $PATH. The service itself answers /v1/status with 200.
  • Same for ghcr.io/gonka-ai/devshard-gateway:mainnet-v0.2.15-v4.1 and mainnet-v0.2.15-v4-latest (the compose default tag).
  • Present on every branch checked (main, devshard-0.2.x-v6, devshard/v7, upgrade-v0.2.17). Reported internally on 2026-09-16; since then cbb20c196 (Oct 7) and e2e7873a6 (Oct 12) re-added the same curl line.

Impact

Container health is always unhealthy, so depends_on: condition: service_healthy, orchestration restarts and health-based alerting are misled; operators cannot tell a broken gateway from a healthy one via docker ps.

Fix (either)

  • compose: test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://localhost:8080/v1/status"]
  • or Dockerfile: RUN apk add --no-cache ca-certificates curl in the devshardctl-runtime stage.

The same check should be applied to any other compose file that healthchecks a devshardctl-based container.


🔄 Auto-synced from Issue #2085 every hour.