Есть ли какой-либо способ динамически устанавливать системное время контейнеров Docker (во время выполнения), не влияя на хост-машину?
С помощью
hwclock --set --date "Sat Aug 17 08:31:24 PDT 2016"
выдает следующую ошибку:
hwclock: Cannot access the Hardware Clock via any known method.hwclock: Use the --debug option to see the details of our search for an access method.
С помощью
date -s "2 OCT 2006 18:00:00"
выдает следующую ошибку:
date: cannot set date: Operation not permitted
Пример использования:
Мне нужно протестировать программное обеспечение, чувствительное ко времени (поведение зависит от даты).
Другие распространенные варианты использования:
- запуск устаревшего программного обеспечения с ошибками y2k
- тестирование программного обеспечения на соответствие требованиям 2038 года
- проблемы, связанные со временем отладки, такие как просроченные SSL-сертификаты
- запущенное программное обеспечение, которое перестает работать по истечении определенного периода времени
- детерминированные процессы сборки.
Это возможно
Решение состоит в том, чтобы подделать его в контейнере. Эта библиотека перехватывает все системные вызовы, используемые программами для получения текущего времени и даты.
Реализация проста. Добавьте функциональность в свой Dockerfile по мере необходимости:
WORKDIR /RUN git clone https://github.com/wolfcw/libfaketime.gitWORKDIR /libfaketime/srcRUN make install
Не забудьте установить переменные среды LD_PRELOAD
перед запуском приложения, к которому вы хотите применить поддельное время.
Пример:
CMD ["/bin/sh", "-c", "LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME_NO_CACHE=1 python /srv/intercept/manage.py runserver 0.0.0.0:3000]
Теперь вы можете динамически изменять время работы серверов:
Пример:
import osdef set_time(request): print(datetime.today()) os.environ["FAKETIME"] = "2020-01-01" # Note: time of type string must be in the format "YYYY-MM-DD hh:mm:ss" or "+15d" print(datetime.today())
Вот docker-compose
решение:
Добавь /etc/localtime:/etc/localtime:ro
к volumes
атрибут.
Проверьте это ссылка для получения примера.
Запустите контейнер с дополнительной переменной среды:
docker run -e "SET_CONTAINER_TIMEZONE=true" \ -e "CONTAINER_TIMEZONE=US/Arizona" [docker image name]
На самом деле, я только что нашел и положительно протестировал решение с использованием libfaketime
Я скоро обновлю ответ + рабочий пример.
Какова была бы цель этого? каков ваш вариант использования?
Пожалуйста, смотрите раздел редактировать.