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

от автора

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


ссылка на оригинал статьи https://habr.com/ru/articles/856698/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *