Arranque secuencial
De manera predefinida se asume que los distintos contenedores del proyecto funcionan de manera independiente unos de otros.
Dependencia básica
Para aquellos casos donde se requiera
que unos contenedores arranquen después que otros
se utiliza el campo
depends_on
:
services:
primero:
image: imagen_1
segundo:
image: imagen_2
depends_on:
- primero
Durante el despliegue el segundo contenedor se crea después del primero. Durante la eliminación el segundo contenedor es removido primero.
Un contenedor determinado puede depender de múltiples servicios al mismo tiempo.
Opciones agregadas
A las dependencias de servicios se les puede configurar varias opciones adicionales:
services:
primero:
image: imagen_1
segundo:
image: imagen_2
depends_on:
primero:
restart: true
condition: service_started # valor default
required: true # valor por default
-
El parámetro
condition
admite varias opciones repecto al servicio apuntado:service_started
: el servicio debe haber arrancado (opción predefinida);service_healthy
: el servicio debe estar funcionando correctamente, esto se comprueba con un test específico;service_completed_successfully
: el servicio debe completarse exitosamente.
-
El parámetro
restart
ordena el reinicio del contenedor actual en cuanto el servicio requerido esté listo. -
El parámetro
required
especifica si es obligatorio que el servicio apuntado haya sido arrancado o esté disponible. Si es seteado comofalse
entonces el comandocompose
sólo advertirá en caso que el servicio requerido no está disponible, no inició o finalizó de manera incorrecta.
Test de servicio
Los tests de servicio ayudan a verificar que los contenedores requeridos por los demás estén funcionando adecuadamente. Sólo cuando los tests requeridos sean exitosos se ponen en marcha los contenedores dependientes.
El uso básico del healthcheck sigue la siguiente sintaxis:
services:
primero:
image: imagen_1
segundo:
image: imagen_2
depends_on:
primero:
condition: service_healthy
Cuando se elige una dependencia del tipo service_healthy
es necesario que el servicio apuntado
tenga ya definido un test de funcionamiento.
Sobreescribir chequeos
Mediante el parámetro healthcheck
se puede cambiar
qué comando de test realizar
sobre el contenedor elegido
y modificar sus opciones de ejecución:
services:
primero:
image: imagen_1
healthcheck:
# configuraciones custom
test: ["CMD-SHELL", "comando_test_custom"]
start-period: 10s # demora para el primer intento
interval: 10s # intervalo entre intentos
timeout: 60s # tiempo limite de test
retries: 5 # nº máximo de reintentos
disabled: false # bypass del test - desactivado por default
segundo:
image: imagen_2
depends_on:
primero:
condition: service_healthy
De esta manera el gestor de contenedores verifica que el primer contenedor funcione adecuadamente antes de intentar la puesta en marcha del segundo.
Se sobreentiende que la imagen del primer contenedor debe disponer de los comandos de prueba pedidos, de otra manera la ejecución falla.
Chequeo por default
Los tests incorporados en las imágenes
se definen adentro del archivo Dockerfile
mediante la cláusula HEALTHCHECK
:
Las opciones permitidas y sus valores predefinidos son:
Opción | Valor default |
---|---|
--interval=DURACION |
30s |
--timeout=DURACION |
30s |
--start-period=DURACION |
0s |
--start-interval=DURACION |
5s |
--retries=INTENTOS |
3 |
Por ejemplo, para que el test sea reintentado cada 5 minutos y su duración no pase de 3 segundos:
HEALTHCHECK --interval=5m --timeout=3s \
CMD comando_healthcheck || exit 1
En caso de requerirse la anulación del chequeo interno
se escribe simplemente NONE
:
El valor de salida del comando es el que indica al sistema si el test fue exitoso o no. Los valores posibles son:
Valor retorno | significado |
---|---|
0 |
success - test correcto |
1 |
unhealthy - test fallido |
2 |
reserved (no utilizar) |
Uso en Python
Si el healthcheck de la imagen está implementado dentro de una rutina de Python entonces la forma del comando sería algo como:
HEALTHCHECK --interval=5m --timeout=3s \
CMD python rutina_healthcheck.py
en tal caso se requiere que los valores de retorno sean acordes con el resultado del test.
Si en cambio se utiliza un comando o test que pueda fallar en el proceso (por ejemplo Pytest) entonces el comando quedaría así:
HEALTHCHECK --interval=5m --timeout=3s \
CMD pytest carpeta_tests/ || exit 1
Referencias
Docker Docs - Compose file reference - depends_on