| Управление временем контейнера с помощью docker-compose и faketime |
| 24.11.2025 00:00 |
|
Оригинальная публикация
Зачем нам управлять временем?В начале немного о себе, мое основное занятие — обеспечение качества на вверенных проектах, я Senior QA в компании Umbrella IT. Периодически при тестировании микросервисов приходится сталкиваться с необходимостью изменения времени для проверки работы того или иного функционала. Это может быть функционал, который срабатывает по «тику» cron, или связанный с применением системного времени как одного из условий обработки/хранения/передачи данных тестируемым микросервисом. Если микросервис разворачивается в Docker, то время контейнера берется из системного времени хост машины и без дополнительных инструментов максимум, что мы можем поменять — это часовой пояс контейнера, но не само системное время. Проблема в том, что часто для целей тестирования просто изменения часового пояса, ровно как и изменения времени в пределах 24х часов, оказывается недостаточно. Что делать если нам нужно протестировать работу микросервиса в граничных значениях даты‑времени, например начало и конец месяца/года, или использовать замечательные даты, такие как 29 февраля, последние даты месяцев со сменой количества дней, и так далее? Конечно можно поднять виртуальную машину, изменить на ней системное время, перезагрузить Docker и задеплоить нужный нам микросервис. Вполне вероятно, что в кейсах, когда микросервису нужно поддерживать множество сетевых подключений на разных портах (почта, БД, gRPC и тд), нам придется пробрасывать эти порты, возможно (в зависимости от выбора реализации) настраивать туннели и тд. Даже если подобная реализация заработает, то нужно принимать во внимание возможные риски снижения ценности тестирования по причине наращивания «костылей» подключения и недостатков реализации с использованием отдельной виртуальной машины. Все это отдаляет условия тестирования от реальных условий использования. Что же делать если нам нужно одновременно:
До описания инструкции хочу выразить благодарность Нестерович Александру за помощь в реализации и отладке ниже описанного подхода. Инструкция к применениюИтак перед нами стоит задача развернуть в тестовом окружении (например кластер FT) контейнер с микросервисом и задать ему время, отличное от времени хост машины. Сразу перечислим основные требуемые доступы для этой реализации на FT окружении (это может быть выделенная машина для проведения тестирования, которая находится в FT кластере):
Для настройки деплоя нашего микросервиса создадим файл Все поля, кроме тех, что помечены комментом “Поле по теме статьи”, не относятся к вопросу управления системным временем и добавлены только для того, чтобы наш
В папке с файлом В самом файле пишем на bash следующий код: Для изменения системного времени при запуске микросервиса мы используем faketime. Это приложение которое подменяет значение системного времени для выполняемой с помощью нее команды. Например при выполнении команды
Все что нам осталось, это запустить деплой командой И вот у нас снова 2007. Как мы видим, время в контейнере не фиксированное и изменяется с его течением, что отражено в логах
Возможные проблемы и пути их решенияСетевое взаимодействие Каким бы нативным не был подход к изменению времени, мы можем столкнуться с тем, что при сетевом взаимодействии с использованием сертификатов (например простом https), у нас не будет установлено соединение. Причина тому - проверка сертификата, а именно связанных с ним дат. В случае возникновения таких проблем для проведения тестирования можно:
Выбор решения зависит от каждого конкретного случая/проекта, что будет быстрее, удобнее, меньше влиять на эффективность тестирования или просто будет выполнимо. Отсутствие доступа на выполнение команд при деплое контейнера Бывает так, что в целях безопасности дефолтному пользователю закрывают возможность выполнять команды при сборке контейнера. В таких случаях необходимо в Отсутствие faketime среди доступных к установке приложений Если вдруг в вашем случае простая установка через Инструкцию по использованию libfaketime можно найти в readme репозитория ЗаключениеУправление системным временем контейнера дает широкие возможности по тестированию функционала сервисов, которые используют эти данные в своей логике. Это позволяет увеличить тестовое покрытие, сократить время затраченное на само тестирование, гибко управлять окружением и при необходимости воспроизводить специфические кейсы. |