Как создать механизм отключения (kill switch) для контейнеров Docker?

Я запускаю программу в контейнере Docker на отдельном компьютере, и недавно она начала потреблять так много памяти, что система полностью зависает. Как мне написать скрипт, который будет выполнять команду `docker stop app`, если использование памяти, согласно команде `docker stats app`, превышает 4 ГБ? Следует учитывать, что увеличенное потребление памяти происходит не мгновенно, а за несколько секунд, поэтому достаточно проверять состояние памяти раз в секунду.
  • 4 октября 2024 г. 8:24
Ответы на вопрос 2
Создание механизма отключения (kill switch) для контейнеров Docker основывается на регулярной проверке потребления памяти вашего контейнера и завершении его работы, если оно превышает определенный порог. Вы можете использовать Bash-скрипт для этой задачи. Вот пример такого скрипта:

```bash
#!/bin/bash

# Имя вашего контейнера
CONTAINER_NAME="app"

# Пороговое значение в байтах (4 ГБ)
THRESHOLD=$((4 * 1024 * 1024 * 1024))

while true; do
    # Получение текущего использования памяти контейнера в байтах
    MEMORY_USAGE=$(docker stats --no-stream --format "{{.MemUsage}}" $CONTAINER_NAME | awk -F'/' '{print $1}' | sed 's/[^0-9]*//g')

    # Проверяем, если использование памяти превышает порог
    if [ -n "$MEMORY_USAGE" ] && [ "$MEMORY_USAGE" -gt "$THRESHOLD" ]; then
        echo "Использование памяти контейнера $CONTAINER_NAME превышает 4 ГБ. Остановка контейнера..."
        docker stop $CONTAINER_NAME
        break
    fi

    # Ждем 1 секунду перед следующей проверкой
    sleep 1
done
```

### Инструкция по использованию скрипта:

1. Скопируйте этот код в текстовый файл и сохраните его, например, как `kill_switch.sh`.
2. Сделайте скрипт исполняемым, выполнив команду:
   ```bash
   chmod +x kill_switch.sh
   ```
3. Запустите скрипт:
   ```bash
   ./kill_switch.sh
   ```

### Как это работает:
- Скрипт зациклен и использует `docker stats` для получения текущего использования памяти контейнера.
- С помощью `awk` и `sed` извлекается количество использованной памяти в байтах.
- Если это значение превышает 4 ГБ (4 * 1024 * 1024 * 1024 байт), то выполняется команда `docker stop` для остановки контейнера.
- Скрипт делает паузу на 1 секунду перед следующей проверкой.

### Замечания:
- Если у вас несколько контейнеров, вы можете адаптировать этот скрипт, добавив логику для проверки всех контейнеров или передавая имя контейнера как аргумент.
- Убедитесь, что у вас есть необходимые права для выполнения команд Docker, возможно, вам придется запускать скрипт от имени суперпользователя или с помощью `sudo`.
Нужен не киллсвитч, а ограничение по памяти для контейнера. Делается одной директивой.
Похожие вопросы