I need my BFF service to wait for keycloak to be fully launched using condition service_health, and then start its launch. I can't set up a health check for keycloak. When searching for an answer, I come across either strange or outdated answers related to curl, which is no longer in the new version of keycloak. How do I set up the healthcheck keycloak correctly?
services:
gateway:
image: 'my-service-bff:0.0.1-SNAPSHOT'
container_name: 'my-service-bff'
ports:
- '8080:8080'
depends_on:
keycloak:
condition: service_healthy
postgres:
image: 'postgres:latest'
container_name: 'postgres-db'
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_DB: keycloakdb
POSTGRES_USER: keycloakuser
POSTGRES_PASSWORD: keycloakpass
healthcheck:
test: pg_isready -U keycloakuser -d keycloakdb
interval: 10s
timeout: 3s
retries: 3
start_period: 5s
networks:
- keycloak-network
keycloak:
container_name: keycloak
image: quay.io/keycloak/keycloak:23.0.4
environment:
KC_HEALTH_ENABLED: true
DB_VENDOR: POSTGRES
DB_ADDR: postgres
DB_DATABASE: keycloakdb
DB_SCHEMA: public
KEYCLOAK_USER: user
KEYCLOAK_PASSWORD: user
KEYCLOAK_ADMIN: admin
KEYCLOAK_ADMIN_PASSWORD: admin
ports:
- "9090:8080"
command:
- "start-dev"
networks:
- 'keycloak-network'
depends_on:
postgres:
condition: service_healthy
healthcheck:
# Unsuccessful attempts:
# test: [ "CMD", "curl", "-f", "http://0.0.0.0:8080/realms/master" ]
# test: ['CMD-SHELL', '[ -f /tmp/HealthCheck.java ] || echo "public class HealthCheck { public static void main(String[] args) throws java.lang.Throwable { System.exit(java.net.HttpURLConnection.HTTP_OK == ((java.net.HttpURLConnection)new java.net.URI.create(args[0]).toURL().openConnection()).getResponseCode() ? 0 : 1); } }" > /tmp/HealthCheck.java && java /tmp/HealthCheck.java http://localhost:8080/health/live']
start_period: 10s
interval: 30s
retries: 3
timeout: 5s
networks:
keycloak-network:
driver: 'bridge'
volumes:
postgres_data:
driver: 'local'