Жизненный цикл контейнеров в Docker Compose: использование хуков post_start, pre_stop

68efdb8a297038d91b8a5d7722f15028.png

В версии 2.30.0 Docker Compose появился новый функционал — хуки жизненного цикла контейнера. Давайте разберемся, что это такое и как их использовать для решения практических задач.

Введение

При запуске контейнера Docker Compose использует два элемента — ENTRYPOINT и COMMAND — для управления процессами при старте и остановке. Однако иногда удобнее обрабатывать эти задачи отдельно с помощью специальных хуков — команд, которые выполняются сразу после запуска контейнера или непосредственно перед его остановкой.

Особенно полезно то, что хуки могут иметь специальные привилегии (например, запускаться от root), даже если сам контейнер работает с пониженными привилегиями в целях безопасности. Это позволяет выполнять определенные задачи, требующие повышенных прав, не компрометируя общую безопасность контейнера.

Post-start хуки

Post-start хуки — это команды, которые выполняются после запуска контейнера. Важно отметить, что точное время их выполнения не гарантируется относительно выполнения entrypoint контейнера.

Рассмотрим практический пример:

services:
  app:
    image: backend
    user: 1001
    volumes:
      - data:/data    
    post_start:
      - command: chown -R /data 1001:1001
        user: root

volumes:
  data: {}

В этом примере хук используется для изменения владельца volume на пользователя без root-прав. Это необходимо, поскольку Docker volumes по умолчанию создаются с правами root. После запуска контейнера команда chown меняет владельца директории /data на пользователя с UID 1001.

Pre-stop хуки

Pre-stop хуки выполняются перед остановкой контейнера, когда она происходит по команде (например, docker compose down или при остановке с помощью Ctrl+C). Важно понимать, что эти хуки не будут выполнены, если контейнер останавливается самостоятельно или аварийно завершается.

Пример использования pre-stop хука:

services:
  app:
    image: backend
    pre_stop:
      - command: ./data_flush.sh

В данном случае перед остановкой контейнера будет выполнен скрипт data_flush.sh для корректного завершения работы приложения.

Конфигурация post_start хуков

При настройке post_start хуков доступны следующие параметры:

  • command: Обязательный параметр, определяющий команду для выполнения после запуска контейнера

  • user: Пользователь, от имени которого будет выполняться команда

  • privileged: Флаг для запуска команды с привилегированным доступом

  • working_dir: Рабочая директория для выполнения команды

  • environment: Переменные окружения специфичные для команды post_start

Пример полной конфигурации:

services:
  test:
    post_start:
      - command: ./do_something_on_startup.sh
        user: root
        privileged: true
        environment:
          - FOO=BAR

Конфигурация pre_stop хуков

Pre-stop хуки имеют идентичный набор параметров конфигурации, что и post_start хуки. Единственное отличие заключается в том, что они выполняются перед остановкой контейнера.

Практические применения

Хуки жизненного цикла особенно полезны в следующих сценариях:

  1. Инициализация данных при первом запуске

  2. Изменение прав доступа к файлам и директориям

  3. Очистка временных файлов перед остановкой

  4. Сохранение состояния приложения

  5. Корректное завершение соединений с базами данных

Заключение

Хуки жизненного цикла в Docker Compose — это мощный инструмент для управления поведением контейнеров при запуске и остановке. Они позволяют решать задачи, требующие повышенных привилегий, не жертвуя при этом безопасностью основного приложения. При правильном использовании хуки могут значительно упростить управление состоянием контейнеров и автоматизацию различных операций обслуживания.

© Habrahabr.ru