Blog

Docker compose: hacer que kong espere a postgres

Docker compose: hacer que kong espere a postgres

Kong depende de postgresql en mi docker-compose:

# docker-compose.yml
services:
  postgresql:
    # image: postgres:9.6.10-alpine
    image: postgres:12.0-alpine
    container_name: postgresql
    ports:
      - 5432:5432
    environment:
      - POSTGRES_PASSWORD=postgres
    healthcheck:
      test: echo "SELECT 1" | psql --username postgres --quiet --no-align --tuples-only | grep -q 1 || exit 1
      interval: 2s
      timeout: 1s
      retries: 5
      start_period: 1s

  kong:
    image: library/kong:0.14.0-alpine
    container_name: kong
    depends_on:
      - postgresql:
    env_file:
      - env_files/kong.env
    ports:
      - 8000:8000
      - 8001:8001
    healthcheck:
      test: wget -q --spider http://localhost:8001/status || exit 1
      interval: 60s
      timeout: 5s
      retries: 3
      start_period: 10s

Actualizo las rutas de kong justo después de hacer docker-compose:

# run.sh
docker-compose up -d kong
../kong-setup/data/routes.sh

Sin embargo, es común que routes.sh me devuelva connection refused. Mirando en docker log kong:

# docker logs kong
2022/01/05 15:14:02 [error] 1#0: init_by_lua error: /usr/local/share/lua/5.1/kong/init.lua:197: [postgres error] could not retrieve server_version: FATAL: the database system is starting up
stack traceback:
	[C]: in function 'error'
	/usr/local/share/lua/5.1/kong/init.lua:197: in function 'init'
	init_by_lua:3: in main chunk

La solución es que kong espere al healthcheck de postgresql mediante condition: service_healthy:

# docker-compose.yml
  kong:
    image: library/kong:0.14.0-alpine
    container_name: kong
    depends_on:
      postgresql:
        condition: service_healthy
    env_file:
      - env_files/kong.env
    ports:
      - 8000:8000
      - 8001:8001
    healthcheck:
      test: wget -q --spider http://localhost:8001/status || exit 1
      interval: 60s
      timeout: 5s
      retries: 3
      start_period: 10s

Ahora inicia postgresql, hay un pequeño retardo de 1/2 segundos y después un correcto arranque de kong:

j@bt ~/Documents/trabajo/bt/true-dev (kojin) % ./run.sh 
Starting elasticsearch ... done
Starting redis ... done
Starting redis_test ... done
Starting postgresql ... done
Starting kong       ... done
postgresql is up-to-date
Starting vault ... done

# Ejecución de routes.sh. Antes fallaba a veces, devolviendo connection refused. Ahora siempre funciona bien: 

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   250  100   250    0     0     92      0  0:00:02  0:00:02 --:--:--    92
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   306  100   306    0     0   192k      0 --:--:-- --:--:-- --:--:--  298k
Deleting route 1c2a6ae0-69ad-48a9-ba08-7068014410d8 health
Deleting service 98f43320-125c-4948-9f0d-a4d5bc7786ef health
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   253  100   253    0     0   248k      0 --:--:-- --:--:-- --:--:--  247k
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   383  100   383    0     0   268k      0 --:--:-- --:--:-- --:--:--  374k