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