Каков наилучший способ периодической очистки внутри контейнера докера? - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть докер-контейнер, который запускает простой пользовательский сервер загрузки с использованием uwsgi в Debian и скрипт Python.Файлы создаются и сохраняются внутри контейнера для каждого запроса.Теперь периодически я хочу удалять старые файлы, сгенерированные сервером для прошлых запросов.

До сих пор я добивался очистки с помощью cronjob на хосте , который выглядит примерно так:

*/30 * * * *   docker exec mycontainer /path/on/container/delete_old_files.sh

Но у этого есть несколько недостатков:

  • Cron должен быть установлен и запущен на хосте докера
  • Пользователь должен вручную добавить cronjob длякаждый контейнер, который они запускают
  • В исходном коде есть дополнительный скрипт очистки
  • Необходимость задания cron должна быть задокументирована

Я бы предпочелрешение, которое разворачивается с док-контейнером, а также подходит для более общих периодических задач на фоне док-контейнера.

Есть ли лучшие практики по этому поводу?

Есть ли в python или uwsgi простой механизм для периодических фоновых задач?

Я знаю, что мог бы установить cron внутри контейнера и что-то вроде: CMD ['sh', '-c', 'cron; uswgi <uswgi-options>... --wsgi-file server.py'], но это кажетсянемного клонит и против философии докера.

Решение, подобное этому в server.py:

def cleanup():
    # ...
    threading.Timer(30*60, cleanup).start() # seconds...

cleanup()

# ... rest of the code here ...

Кажется хорошим, но я не уверен, как оно мешает собственному uwsgiмногопоточность и обработка.

Вроде бы простая проблема, но это не так.

1 Ответ

0 голосов
/ 26 ноября 2018

Вы должны не хранить данные в реальном времени в контейнерах.Контейнеры могут быть немного хрупкими, и их нужно регулярно удалять и перезапускать (потому что вы забыли опцию; потому что базовое изображение имеет критическое исправление безопасности), и когда это произойдет, вы потеряете все данные, которые находятся в контейнере.

Вместо этого вы можете использовать опцию docker run -v, чтобы данные сохранялись в пути на хосте.Если они все в одном и том же месте, то у вас может быть одна работа cron, которая очищает их всех.Запуск cron на хосте, вероятно, является правильным решением, хотя в принципе у вас может быть отдельный выделенный контейнер cron, который выполнял очистку.

...