Ускоряем время в docker на примере docksal

Главные вкладки

ivnish 24 августа в 15:26
4

Возникла задача с тестированием модуля подписок для drupal commerce. Модуль подписок должен отменять подписку при невозможности списания денег с карты подписчика. Но проблема в том, что после неудачного списания должно пройти 24 часа, прежде чем подписка будет отменена. После недели обычного тестирования я понял, что пора брать управление временем в свои руки.

Существует библиотека libfaketime, которая позволяет обманывать приложения, подсовывая им указанное вами время.

Чтобы использовать её в проекте docksal нужно:

1) Создать в папке проекта .docksal/services/cli/ файл Dockerfile

FROM docksal/cli:php7.4-3.1

RUN git clone https://github.com/wolfcw/libfaketime && cd libfaketime && make && make install

после FROM нужно указать образ от которого вы будете наследоваться

2) В файл docksal.yml нужно дописать

 
  cli:
    image: ${COMPOSE_PROJECT_NAME_SAFE}_cli
    build: services/cli
    environment:
      - LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1
      - FAKETIME=@2022-08-20 10:00:01

где в FAKETIME можно писать нужное время. Если убрать символ @ то время не будет идти, а замрет на указанном значении

3) Запускаем/перезапускаем проект fin p start и проверяем время, например вызовом

<?php
echo date("Y-m-d H:i:s");
?>

Авторы

ivnish Drupal FullStack Developer, модератор drupal.ru