Search code examples
kubernetesdocker-composeethereum

Docker Compose health check of HTTP API using tools outside the container


I am implementing a Docker Compose health check for Prysm Docker container. Prysm is Ethereum 2 node.

My goal is to ensure that RPC APIs (gRPC, JSON-RPC) of Prysm are up before starting other services in the same Docker Compose file, as those services depend on Prysm. I can use depends_on of Docker Compose file for this, but I need to figure out how to construct a check that checks if Prysm HTTP ports are ready to accept traffic.

The equivalent Kubernetes health check is:

  readinessProbe:
    initialDelaySeconds: 180
    timeoutSeconds: 1
    periodSeconds: 60
    failureThreshold: 3
    successThreshold: 1
    httpGet:
      path: /healthz
      port: 9090
      scheme: HTTP
  livenessProbe:
    initialDelaySeconds: 60
    timeoutSeconds: 1
    periodSeconds: 60
    failureThreshold: 60
    successThreshold: 1
    httpGet:
      path: /healthz
      port: 9090
      scheme: HTTP

The problem with Prysm image is that it lacks normal UNIX tools within the image (curl, netcat, /bin/sh) one usually uses to create such checks.

Is there a way to implement an HTTP health check with Docker Compose that would use built-in features in compose (are there any) or commands from the host system instead of ones within the container?


Solution

  • I managed to accomplish this by creating another service using Dockerize image.

    version: '3'
    services:
    
      # Oracle connects to ETH1 and ETH2 nodes
      # oracle:
      stakewise:
        container_name: stakewise-oracle
        image: stakewiselabs/oracle:v1.0.1
        # Do not start oracle service until beacon health check succeeds
        depends_on:
          beacon_ready:
            condition: service_healthy
    
      # ETH2 Prysm node
      beacon:
        container_name: eth2-beacon
        image: gcr.io/prysmaticlabs/prysm/beacon-chain:latest
        restart: always
        hostname: beacon-chain
    
      # An external startup check tool for Prysm
      # Using https://github.com/jwilder/dockerize
      # Simply wait that TCP port of RPC becomes available before
      # starting the Oracle to avoid errors on the startup.
      beacon_ready:
        image: jwilder/dockerize
        container_name: eth2-beacon-ready
        command: "/bin/sh -c 'while true ; do dockerize -wait tcp://beacon-chain:3500 -timeout 300s ; sleep 99 ; done'"
        depends_on:
          - beacon
        healthcheck:
          test: ["CMD", "dockerize", "-wait", "tcp://beacon-chain:3500"]
          interval: 1s
          retries: 999