TL;DR

  • Docker Compose 2.30.0 добавил поддержку хуков жизненного цикла

  • Хуки позволяют выполнять команды после старта (post_start) и перед остановкой (pre_stop) контейнера

  • Можно запускать команды с root-правами, даже если основной контейнер работает под обычным пользователем

  • Главные применения: инициализация данных, очистка ресурсов, управление правами доступа

Введение

При запуске контейнера 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 - это мощный инструмент для управления поведением контейнеров при запуске и остановке. Они позволяют решать задачи, требующие повышенных привилегий, не жертвуя при этом безопасностью основного приложения. При правильном использовании хуки могут значительно упростить управление состоянием контейнеров и автоматизацию различных операций обслуживания.

Комментарии (0)