# Usar hooks de ciclo de vida con Compose





## Hooks de ciclo de vida de los servicios

Cuando Docker Compose ejecuta un contenedor, utiliza dos elementos,
[ENTRYPOINT y COMMAND](/engine/containers/run/#default-command-and-options),
para gestionar lo que sucede cuando el contenedor se inicia y se detiene.

Sin embargo, a veces puede resultar más sencillo gestionar estas tareas por separado utilizando hooks de ciclo de vida: comandos que se ejecutan justo después de que el contenedor se inicia o justo antes de que se detenga.

Los hooks de ciclo de vida son especialmente útiles porque pueden tener privilegios especiales (como ejecutarse como usuario root), incluso cuando el contenedor en sí se ejecuta con privilegios menores por motivos de seguridad. Esto significa que ciertas tareas que requieren permisos más altos se pueden realizar sin comprometer la seguridad general del contenedor.

### Hooks post-inicio (Post-start hooks)

Los hooks post-inicio son comandos que se ejecutan después de que el contenedor se ha iniciado, pero no hay un tiempo establecido para determinar cuándo exactamente se ejecutarán. El momento de ejecución del hook no está garantizado durante la ejecución del `entrypoint` del contenedor.

Debido a que no existe una garantía de orden entre el hook y el entrypoint del contenedor, los hooks post-inicio son más adecuados para tareas que no necesitan completarse antes de que la aplicación comience a ejecutarse, como registrar el contenedor en un sistema externo.

En el siguiente ejemplo, después de que el contenedor se inicia, un hook a nivel de root registra el servicio en un registro de servicios interno. La aplicación no depende de que el registro se complete antes de comenzar a atender peticiones.

```yaml
services:
  app:
    image: backend
    user: 1001
    post_start:
      - command: /opt/scripts/register-service.sh
        user: root
```

### Hooks pre-parada (Pre-stop hooks)

Los hooks pre-parada son comandos que se ejecutan antes de que el contenedor sea detenido por un comando específico (como `docker compose down` o deteniéndolo manualmente con `Ctrl+C`). Estos hooks no se ejecutarán si el contenedor se detiene por sí mismo o se finaliza de forma repentina.

Debido a que el hook pre-parada se ejecuta antes de que se envíe la señal de parada al contenedor, es adecuado para acciones que deben completarse mientras la aplicación aún está en pleno funcionamiento.

En el siguiente ejemplo, el hook realiza una copia de seguridad de un archivo de datos antes de que el contenedor reciba la señal de parada.

```yaml
services:
  app:
    image: backend
    volumes:
      - data:/data
    pre_stop:
      - command: cp /data/app.db /data/app.db.bak

volumes:
  data: {} # se crea un volumen de Docker con propiedad de root
```

## Información de referencia

- [`post_start`](/reference/compose-file/services/#post_start)
- [`pre_stop`](/reference/compose-file/services/#pre_stop)

