From 33ce469ab0206b161b60983fabca86d666fdc839 Mon Sep 17 00:00:00 2001 From: loks0n <22452787+loks0n@users.noreply.github.com> Date: Wed, 11 Mar 2026 21:44:15 +0000 Subject: [PATCH] Add Docker healthcheck and use --wait instead of polling loop Replace the manual shell polling loop (until doctor > /dev/null) with a proper Docker healthcheck on the appwrite service and `docker compose up --wait`, which blocks until healthchecks pass. Also reverts the timeout back to 3 minutes now that image pulls are cached. Co-Authored-By: Claude Opus 4.6 --- .github/workflows/tests.yml | 64 ++++++++++--------------------------- docker-compose.yml | 5 +++ 2 files changed, 21 insertions(+), 48 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 5c20ca094d..cebcd2a62c 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -109,15 +109,11 @@ jobs: password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Load and Start Appwrite - timeout-minutes: 10 + timeout-minutes: 3 run: | docker load --input /tmp/${{ env.IMAGE }}.tar docker compose pull --quiet --ignore-buildable - docker compose up -d - until docker compose exec -T appwrite doctor > /dev/null 2>&1; do - echo "Waiting for Appwrite to be ready..." - sleep 2 - done + docker compose up -d --quiet-pull --wait - name: Environment Variables run: docker compose exec -T appwrite vars @@ -153,15 +149,11 @@ jobs: password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Load and Start Appwrite - timeout-minutes: 10 + timeout-minutes: 3 run: | docker load --input /tmp/${{ env.IMAGE }}.tar docker compose pull --quiet --ignore-buildable - docker compose up -d - until docker compose exec -T appwrite doctor > /dev/null 2>&1; do - echo "Waiting for Appwrite to be ready..." - sleep 2 - done + docker compose up -d --quiet-pull --wait - name: Wait for Open Runtimes timeout-minutes: 3 @@ -259,7 +251,7 @@ jobs: password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Load and Start Appwrite - timeout-minutes: 10 + timeout-minutes: 3 env: _APP_BROWSER_HOST: http://invalid-browser/v1 _APP_DATABASE_SHARED_TABLES: "" @@ -267,11 +259,7 @@ jobs: run: | docker load --input /tmp/${{ env.IMAGE }}.tar docker compose pull --quiet --ignore-buildable - docker compose up -d - until docker compose exec -T appwrite doctor > /dev/null 2>&1; do - echo "Waiting for Appwrite to be ready..." - sleep 2 - done + docker compose up -d --quiet-pull --wait - name: Wait for Open Runtimes timeout-minutes: 3 @@ -359,18 +347,14 @@ jobs: password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Load and Start Appwrite - timeout-minutes: 10 + timeout-minutes: 3 env: _APP_DATABASE_SHARED_TABLES: database_db_main _APP_DATABASE_SHARED_TABLES_V1: ${{ matrix.tables-mode == 'Shared V1' && 'database_db_main' || '' }} run: | docker load --input /tmp/${{ env.IMAGE }}.tar docker compose pull --quiet --ignore-buildable - docker compose up -d - until docker compose exec -T appwrite doctor > /dev/null 2>&1; do - echo "Waiting for Appwrite to be ready..." - sleep 2 - done + docker compose up -d --quiet-pull --wait - name: Wait for Open Runtimes timeout-minutes: 3 @@ -427,7 +411,7 @@ jobs: password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Load and Start Appwrite - timeout-minutes: 10 + timeout-minutes: 3 env: _APP_OPTIONS_ABUSE: enabled _APP_DATABASE_SHARED_TABLES: "" @@ -435,11 +419,7 @@ jobs: run: | docker load --input /tmp/${{ env.IMAGE }}.tar docker compose pull --quiet --ignore-buildable - docker compose up -d - until docker compose exec -T appwrite doctor > /dev/null 2>&1; do - echo "Waiting for Appwrite to be ready..." - sleep 2 - done + docker compose up -d --quiet-pull --wait - name: Run Projects tests in dedicated table mode timeout-minutes: 15 @@ -488,7 +468,7 @@ jobs: password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Load and Start Appwrite - timeout-minutes: 10 + timeout-minutes: 3 env: _APP_OPTIONS_ABUSE: enabled _APP_DATABASE_SHARED_TABLES: database_db_main @@ -496,11 +476,7 @@ jobs: run: | docker load --input /tmp/${{ env.IMAGE }}.tar docker compose pull --quiet --ignore-buildable - docker compose up -d - until docker compose exec -T appwrite doctor > /dev/null 2>&1; do - echo "Waiting for Appwrite to be ready..." - sleep 2 - done + docker compose up -d --quiet-pull --wait - name: Run Projects tests in ${{ matrix.tables-mode }} table mode timeout-minutes: 15 @@ -541,18 +517,14 @@ jobs: password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Load and Start Appwrite - timeout-minutes: 10 + timeout-minutes: 3 env: _APP_DATABASE_SHARED_TABLES: "" _APP_DATABASE_SHARED_TABLES_V1: "" run: | docker load --input /tmp/${{ env.IMAGE }}.tar docker compose pull --quiet --ignore-buildable - docker compose up -d - until docker compose exec -T appwrite doctor > /dev/null 2>&1; do - echo "Waiting for Appwrite to be ready..." - sleep 2 - done + docker compose up -d --quiet-pull --wait - name: Wait for Open Runtimes timeout-minutes: 3 @@ -609,18 +581,14 @@ jobs: password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Load and Start Appwrite - timeout-minutes: 10 + timeout-minutes: 3 env: _APP_DATABASE_SHARED_TABLES: database_db_main _APP_DATABASE_SHARED_TABLES_V1: ${{ matrix.tables-mode == 'Shared V1' && 'database_db_main' || '' }} run: | docker load --input /tmp/${{ env.IMAGE }}.tar docker compose pull --quiet --ignore-buildable - docker compose up -d - until docker compose exec -T appwrite doctor > /dev/null 2>&1; do - echo "Waiting for Appwrite to be ready..." - sleep 2 - done + docker compose up -d --quiet-pull --wait - name: Wait for Open Runtimes timeout-minutes: 3 diff --git a/docker-compose.yml b/docker-compose.yml index 0013fdfa64..583b558e60 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -61,6 +61,11 @@ services: container_name: appwrite <<: [*x-logging, *x-build] image: appwrite-dev + healthcheck: + test: ["CMD", "doctor"] + interval: 5s + timeout: 5s + retries: 12 ports: - 9501:80 networks: