Tengo un archivo docker compose con PostgreSQL y mi aplicación, como este:
version: '3'services: postgresql: image: postgres:9.6.6 ports: - 9932:5432 expose: - "5432" environment: - POSTGRES_PASSWORD=pass restart: always volumes: - /data:/var/lib/postgresql/data myapp: image: myapp links: - postgresql depends_on: - "postgresql" restart: always ports: - "5000:5000"
El problema es que restart: always
la política no parece funcionar cuando elimino el contenedor (simulando el bloqueo de la aplicación usando docker kill
) y docker-compose no reinicia mi contenedor, aunque el El código de salida es 137. Observo el mismo comportamiento cuando uso restart: on-failure
directiva. Versiones 2
y 3
de docker-compose se comportan de la misma manera. Mi sistema es Ubuntu Server 16.04 x64.
Mis preguntas son:
- Por qué docker-compose no reinicia el contenedor bloqueado (eliminado)?
- ¿Cómo comprobar si la política de reinicio funciona?
Cuando usa docker kill, este es el comportamiento esperado, ya que Docker no reinicia el contenedor: "Si detiene manualmente un contenedor, su política de reinicio se ignora hasta que se reinicia el demonio de Docker o el contenedor se reinicia manualmente. Este es otro intento de evitar un bucle de reinicio" (referencia)
Si usa docker stop o docker kill, está deteniendo manualmente el contenedor. Puede hacer algunas pruebas sobre las políticas de reinicio: reiniciar el demonio de docker, reiniciar su servidor, usar un CMD dentro de un contenedor y ejecutar una salida...
Por ejemplo, si elimino mi contenedor implementado con una política de reinicio, veo que salió con el código 137 pero no se reinicia de acuerdo con docker ps-a, permanece cerrado:
[root@andromeda ~]# docker ps --allCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES819d1264c30a redis:alpine "docker-entrypoint..." 3 minutes ago Exited (137) 34 seconds ago keepalive_redis_1
Pero si reinicio el demonio...
[root@andromeda ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES819d1264c30a redis:alpine "docker-entrypoint..." 30 minutes ago Up 2 seconds 6379/tcp keepalive_redis_1
El contenedor que se configuró con la política de reinicio, se inicia de nuevo, que es lo que dice la documentación, por lo que docker kill no es la forma en que debe probar la política de reinicio, ya que se supone que ha detenido deliberadamente el contenedor y Docker quiere tener una forma de evitar reiniciar bucles, si lo matas, realmente quieres matarlo.
Encontré valiosos los siguientes enlaces que muestran el mismo comportamiento en diferentes versiones (por lo que no es un error, sino el comportamiento esperado):
Estuve allí muchas veces, pero como puede ver, la documentación no es sólida y no hay una explicación de cómo funciona esta función, por eso hice una pregunta: me gustaría ver la respuesta de alguien con experiencia práctica en este campo.