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