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 хуки. Единственное отличие заключается в том, что они выполняются перед остановкой контейнера.
Визуализация
Практические применения
Хуки жизненного цикла особенно полезны в следующих сценариях:
Инициализация данных при первом запуске
Изменение прав доступа к файлам и директориям
Очистка временных файлов перед остановкой
Сохранение состояния приложения
Корректное завершение соединений с базами данных
Заключение
Хуки жизненного цикла в Docker Compose - это мощный инструмент для управления поведением контейнеров при запуске и остановке. Они позволяют решать задачи, требующие повышенных привилегий, не жертвуя при этом безопасностью основного приложения. При правильном использовании хуки могут значительно упростить управление состоянием контейнеров и автоматизацию различных операций обслуживания.