Как динамически устанавливать системное время в контейнере Docker

Есть ли какой-либо способ динамически устанавливать системное время контейнеров 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

Я скоро обновлю ответ + рабочий пример.

Какова была бы цель этого? каков ваш вариант использования?

Пожалуйста, смотрите раздел редактировать.